我有时看到的一种模式是,构造函数可以不带参数,也可以不带参数。现在,我想知道“更好”的方法是将通用代码移到最定义的构造函数中,还是在这种情况下使用实例初始化器。例如,一种始终为每个创建的类生成ID的方法:

 public SomeClass(){
     this("Hello");
 }

 public SomeClass(String s){
     this.s = s;
     this.id = generateId();
 }


与这样写:

 {
     this.id = generateId(); // method does not depend on the class
 }

 public SomeClass(){
      this("Hello");
 }

 public SomeClass(String s){
      this.s = s;
 }


使用实例初始化器的原因是因为我想在创建类时始终运行该方法,将来其他人可能会更改类的构造函数而忘记这样做。尽管删除实例初始化程序的可能性较小(但不知道您在做什么)。

但是另一方面,我不确定这种情况下的可读性。

这些示例有些人为设计,而不是实际示例。

最佳答案

使用实例初始化程序的原因是因为我想要
  在创建类时及以后始终运行该方法
  其他人可能会更改类的构造函数而忘记做
  这个。虽然不太可能删除实例初始化器
  (没有意识到自己在做什么)。


为了避免在修改类时发生编码错误,不应将一个操作(使用实例初始化程序)或另一个操作(构造函数)用作技巧。
无论如何,为什么Initializer会为此提供更好的保险?

您要确保构造函数执行其设计的工作吗?
编写一个单元测试来验证此行为,并在每次构建时自动执行。
就这样。

关于java - 使用实例初始化程序来处理构造函数重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45432053/

10-12 23:51