在Java 7上午使用 PropertyChangeEvent 类,我突然发现了这个:
/**
* Returns a string representation of the object.
*
* @return a string representation of the object
*
* @since 1.7
*/
public String toString() {
StringBuilder sb = new StringBuilder(getClass().getName());
sb.append("[propertyName=").append(getPropertyName());
appendTo(sb); // <----HERE
sb.append("; oldValue=").append(getOldValue());
sb.append("; newValue=").append(getNewValue());
sb.append("; propagationId=").append(getPropagationId());
sb.append("; source=").append(getSource());
return sb.append("]").toString();
}
void appendTo(StringBuilder sb) {
}
是什么让我发疯,为什么要调用方法appendTo()
?
特别是因为该方法无效?
这有什么意义,我在第一眼看不到?
答案 0 :(得分:5)
如果子类覆盖 appendTo
方法,则非常有意义。
这就是如何将特定的子类东西注入到这个函数中。 (虽然对这种效果的评论会很好)。
替代方法 - 需要完全覆盖toString
- 可能导致相当多的代码重复。
答案 1 :(得分:3)
鉴于实施:
void appendTo(StringBuilder sb) {
}
我认为:这是一个&#34;剩余的&#34 ;;有意成就的东西;但只是被遗忘了。
该方法受包保护;所以你只能在同一个包中的子类中覆盖它;但没有其他地方。并且:它没有在任何地方记录。因此,PropertyChangEvent类的 no 用户甚至会注意到此方法可以被覆盖。
没有有意义的理由做这样的事情。因此我的(自以为是)回答:这是一个错误;或者更准确地说;它是源代码中的错误;但幸运的是,在运行时不会导致失败。好吧,除非一些可怜的人碰巧延伸到这个班级;并碰巧编写了一个非常奇怪的appendTo()方法。
当然,可能做这样的事情;例如,为扩展类提供插入某些自定义元素到toString()
结果中的能力。但如果这是这个结构的目标;它悲惨地失败了;因为没有记录。