为什么空方法附加有意义?

时间:2017-03-01 08:46:41

标签: java methods implementation

在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()

特别是因为该方法无效?

这有什么意义,我在第一眼看不到?

2 个答案:

答案 0 :(得分:5)

如果子类覆盖 appendTo方法,则非常有意义。

这就是如何将特定的子类东西注入到这个函数中。 (虽然对这种效果的评论会很好)。

替代方法 - 需要完全覆盖toString - 可能导致相当多的代码重复。

答案 1 :(得分:3)

鉴于实施:

void appendTo(StringBuilder sb) {
}

我认为:这是一个&#34;剩余的&#34 ;;有意成就的东西;但只是被遗忘了。

该方法受包保护;所以你只能在同一个包中的子类中覆盖它;但没有其他地方。并且:它没有在任何地方记录。因此,PropertyChangEvent类的 no 用户甚至会注意到此方法可以被覆盖。

没有有意义的理由做这样的事情。因此我的(自以为是)回答:这是一个错误;或者更准确地说;它是源代码中的错误;但幸运的是,在运行时不会导致失败。好吧,除非一些可怜的人碰巧延伸到这个班级;并碰巧编写了一个非常奇怪的appendTo()方法。

当然,可能做这样的事情;例如,为扩展类提供插入某些自定义元素到toString()结果中的能力。但如果这是这个结构的目标;它悲惨地失败了;因为没有记录。