ast*_*eri 5 java methods constructor instance
对于所有谈论对象处于"单元化状态"这一事实的人,请参考这个问题的答案,该问题表明可以传递对象引用,解除引用,从中调用方法,并访问字段在构造函数终止并且已分配所有字段(包括 final字段)之前.
所以这是用例:
public class Entity {
private final String name;
public Entity() {
this(toString()); //Nope, Chuck Testa
}
public Entity(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器错误是:
在显式调用构造函数时,不能引用实例方法.
请注意,toString()尚未覆盖,并且是默认调用Object.
我当然对这背后的哲学/技术原因感兴趣,所以如果有人能够解释,那将是一个很棒的奖金.但是我正在寻找一种toString()从默认构造函数调用的方法,因为它引用了具有更多参数的更具体的构造函数.实际的用例有点复杂,最终一直指向一个带有四个参数的构造函数,但这并不重要.
我知道我可以做这样的事......
private static final String TO_STRING_CONSTRUCTOR_ARGUMENT = "aflhsdlkfjlkswf";
public Entity() {
this(TO_STRING_CONSTRUCTOR_ARGUMENT);
}
public Entity(String name) {
this.name = name == TO_STRING_CONSTRUCTOR_ARGUMENT ? toString() : name;
}
Run Code Online (Sandbox Code Playgroud)
......但它似乎是一个非常不优雅的解决方案.
那么,还有什么方法可以把它拉下来?或者任何建议的最佳做法来处理这种情况?
您可以在类中使用静态方法工厂Entity,并将构造函数设为私有:
public class Entity {
private String name;
private Entity() {
}
public Entity(String name) {
this.name = name;
}
public static Entity createEntity() {
Entity result = new Entity();
result.name = result.toString();
return result;
}
}
Run Code Online (Sandbox Code Playgroud)