Java构造函数设计
我在读一段开源代码,有一个构造函数是这样设计的:Java构造函数设计,java,constructor,Java,Constructor,我在读一段开源代码,有一个构造函数是这样设计的: public class FeatureSequence2FeatureVector extends Pipe implements Serializable { boolean binary; public FeatureSequence2FeatureVector (boolean binary) { this.binary = binary; } public FeatureSeq
public class FeatureSequence2FeatureVector extends Pipe implements Serializable
{
boolean binary;
public FeatureSequence2FeatureVector (boolean binary)
{
this.binary = binary;
}
public FeatureSequence2FeatureVector ()
{
this (false);
}
}
public class FeatureSequence2FeatureVector extends Pipe implements Serializable
{
boolean binary = false;
public FeatureSequence2FeatureVector (boolean binary)
{
this.binary = binary;
}
public FeatureSequence2FeatureVector ()
{
}
}
这可能只是一个微不足道的偏好问题,但我会这样做:
public class FeatureSequence2FeatureVector extends Pipe implements Serializable
{
boolean binary;
public FeatureSequence2FeatureVector (boolean binary)
{
this.binary = binary;
}
public FeatureSequence2FeatureVector ()
{
this (false);
}
}
public class FeatureSequence2FeatureVector extends Pipe implements Serializable
{
boolean binary = false;
public FeatureSequence2FeatureVector (boolean binary)
{
this.binary = binary;
}
public FeatureSequence2FeatureVector ()
{
}
}
为类变量指定初始值是否会产生任何可能的负面结果?
这两种方式会几乎一样受欢迎吗 我看到开发人员这样做的一个原因是为了可维护性和未来证明 让我们将其分解为不同的应用程序:
public void foo() {
this.foo(1);
}
public void foo(int a) {
this.foo(a, 2, 3);
}
public void foo(int a, int b, int c) {
// ...
}
假定foo
执行精确的或类似的操作,而不考虑过载。但是,如果该功能发生变化怎么办?在您的示例中,您必须更改两个版本的功能,而在上面的示例中,只有foo(int,int,int)
需要更改
未来验证是API设计中需要考虑的事情,而上述设计模式之所以经常被采用,是因为它能够维护一个代码块,而不是2或3个代码块(或者不管有多少重载)
构造函数没有什么不同,只是它们是通过
this(…)
调用的。这两种方法并不都是首选的
原始方法确保所有初始化都经过主构造函数。第二种方法允许使用不同的路径初始化对象
在你的例子中,这是非常琐碎的。但是使用第二种方法,可以修改一个构造函数,使其执行与另一个构造函数不同的操作,因此,对象的初始化方式取决于选择了哪个构造函数
显示允许不同路径导致问题的情况。实例布尔变量默认情况下使用
false
值初始化。不需要这个(false)代码>和binary=false代码>哦,好吧,也许初始化部分甚至没有必要,尽管为了清楚起见,我还是会把它放在上面。可能的重复。但我的问题不是关于布尔变量的初始值是什么,但是更多关于构造函数的设计方法。如果实例变量是final
,那么您的版本将无法编译,通常最好将所有常量实例变量标记为final
。在这种情况下,foo可能是最终版本,以避免被继承类覆盖,但我认为您有一个很好的观点。foo也可以被私有(或非私有)构造函数替换,每个其他构造函数都必须调用该构造函数(类似于主构造函数)。