我有一个Wicket页面类,它根据抽象方法的结果设置页面标题.
public abstract class BasicPage extends WebPage {
public BasicPage() {
add(new Label("title", getTitle()));
}
protected abstract String getTitle();
}
Run Code Online (Sandbox Code Playgroud)
NetBeans通过消息"构造函数中的可覆盖方法调用"警告我,但它应该有什么问题呢?我能想象的唯一选择是将其他抽象方法的结果传递给子类中的超级构造函数.但是很多参数很难读懂.
对于所有谈论对象处于"单元化状态"这一事实的人,请参考这个问题的答案,该问题表明可以传递对象引用,解除引用,从中调用方法,并访问字段在构造函数终止并且已分配所有字段(包括 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)
......但它似乎是一个非常不优雅的解决方案.
那么,还有什么方法可以把它拉下来?或者任何建议的最佳做法来处理这种情况?