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