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也可以被私有(或非私有)构造函数替换,每个其他构造函数都必须调用该构造函数(类似于主构造函数)。