重载构造函数调用其他构造函数,但不是第一个语句
我在 java 中使用多个构造函数时遇到一些问题。
我想做的是这样的:
public class MyClass {
// first constructor
public MyClass(arg1, arg2, arg3) {
// do some construction
}
// second constructor
public MyClass(arg1) {
// do some stuff to calculate arg2 and arg3
this(arg1, arg2, arg3);
}
}
但我不能,因为第二个构造函数不能调用另一个构造函数,除非它是第一行。
对于这种情况,常见的解决方案是什么? 我无法“在线”计算 arg2 和 arg3。我想也许创建一个构造辅助方法,它将完成实际的构造,但我不确定这是否如此“漂亮”...
编辑:使用辅助方法也是有问题的,因为我的一些字段是最终的,我无法使用辅助方法设置它们。
I'm having some trouble using multiple constructors in java.
what I want to do is something like this:
public class MyClass {
// first constructor
public MyClass(arg1, arg2, arg3) {
// do some construction
}
// second constructor
public MyClass(arg1) {
// do some stuff to calculate arg2 and arg3
this(arg1, arg2, arg3);
}
}
but I can't, since the second constructor cannot call another constructor, unless it is the first line.
What is the common solution for such situation?
I can't calculate arg2 and arg3 "in line". I thought maybe creating a construction helper method, that will do the actual construction, but I'm not sure that's so "pretty"...
EDIT: Using a helper method is also problematic since some of my fields are final, and I can't set them using a helper method.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
通常使用另一种常见方法 - 正如您所建议的“构造助手”。
另一种方法是工厂式方法,其中您有一个
MyClassFactory
,它为您提供MyClass
实例,并且MyClass
只有一个构造函数:I绝对更喜欢第一个选择。
Typically use another common method - a "construction helper" as you've suggested.
The alternative is a Factory-style approach in which you have a
MyClassFactory
that gives youMyClass
instances, andMyClass
has only the one constructor:I definitely prefer the first option.
下一个可能的解决方案是工厂方法。这些静态方法可以重载,并且在计算后它们可以调用私有/受保护的构造函数
编辑:当您有最终字段时,此方法也是理想的选择
Next possible solution is Factory method. These static methods can be overloaded and after calculation they can call the private / protected constructor
EDIT: This method is also ideal when you have a final fields
虽然我更喜欢其他几个答案指出的工厂方法选项,但我想建议另一个选项:您可以使用静态方法来计算其他参数:
Although I prefer the factory method option pointed to by several other answers, I wanted to suggest another option: You can use static methods to do the calculation of your other parameters:
助手和工厂选项非常好。
还有一种:
The helper and factory options are very good.
There is another one:
使用“缺失”标记值 为了
获得最佳结果,请将“常规”构造函数设置为
受保护
或私有
。Use marker values for 'missing'
For best results, make the 'general' constructor
protected
orprivate
.另一种方法是这样的:
Another way is this:
您可以将
MyClass(arg1, arg2, arg3)
的代码移动到辅助方法中(将其命名为Init
或其他名称),然后在两个构造函数中调用此方法。You can move the code of
MyClass(arg1, arg2, arg3)
into helper method (name itInit
or something else ) and then call this method in both constructors.作为给出答案的替代方案,最简单的方法是将参数计算重构为 3 参数构造函数;
As an alternative to the answers given, the simplest way is to refactor the argument calculation to the 3 argument constructor;
您可以创建一个调用构造函数的 工厂方法:
You could create a factory method which calls the constructor: