java - 为什么还可以使用空白构造函数?

标签 java coding-style constructor

我最近在阅读一些 Java,并遇到了一些对我来说很新的东西(成语?):在程序中,具有多个构造函数的类也将始终包含一个空白构造函数。例如:

public class Genotype {
  private boolean bits[];
  private int rating;
  private int length;
  private Random random;

  public Genotype() {              //  <= THIS is the bandit, this one right here
    random = new Random();
  }

  /* creates a Random genetoype */
  public Genotype(int length, Random r) {
    random = r;
    this.length = length;
    bits = new boolean[length];

    for(int i=0;i<length;i++) {
        bits[i] =random.nextBoolean();
    }
  }

  /* copy constructor */
  public Genotype(Genotype g,Random r) {
    random = r;
    bits = new boolean[g.length];
    rating = g.rating;
    length = g.length;

    for(int i=0;i<length;i++) {
        bits[i] = g.bits[i];
    }

  }
}

第一个构造函数似乎不是“真正的”构造函数,似乎在每种情况下都会使用其他构造函数中的一个。那么为什么要定义该构造函数呢?

最佳答案

我不确定您正在阅读的代码是否高质量(我过去审查过一些生物信息学代码,不幸的是,这些代码通常不是由专业开发人员编写的)。例如,第三个构造函数不是复制构造函数,这段代码通常存在问题,所以我不会“读太多”。

第一个构造函数是默认构造函数。它只初始化最低限度,让用户使用 getter 和 setter 设置其余部分。其他构造函数通常是“便利构造函数”,有助于以更少的调用创建对象。但是,这通常会导致构造函数之间的不一致。事实上,最近的研究表明,默认构造函数和后续调用 setter 的方法更可取。

在某些情况下,默认构造函数也很关键。例如,某些框架如 digester(用于直接从 XML 创建对象)使用默认构造函数。 JavaBeans 一般使用默认构造函数等。

此外,一些类继承自其他类。当父对象的初始化“足够好”时,您可能会看到默认构造函数。

在这种特定情况下,如果未定义该构造函数,则必须提前了解所有细节。这并不总是可取的。

最后,有些 IDE 会自动生成默认构造函数,可能编写该类的人都不敢将其删除。

关于java - 为什么还可以使用空白构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/402514/

相关文章:

java - 枚举相同(不同语言)类

java - 如何在 Java 的递归算法中保持 "things done"计数?

c# - 这是好的 C# 风格吗?

c++ - char 赋值中的不兼容类型?

java - 如何将子类方法放入父类(super class) JLabel 中?

java - JFrame 在连续运行代码时卡住

javascript - 如何在没有类的情况下在 React 函数中进行状态操作

Matlab类方法错误

java - 无法使用 AsyncTask 生成 url 图像

php - 为什么查询中的额外空格和换行符不好?