【问题标题】:Why does the empty method appendTo make sense?为什么空方法 appendTo 有意义?
【发布时间】:2017-03-01 08:46:41
【问题描述】:

在 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()这个方法?

尤其是那个方法什么都不做?

这对我一见钟情有什么意义吗?

【问题讨论】:

  • @GhostCat 的包解释是一个 KO 事实,没有子类将能够覆盖 appendTo 方法.....
  • 我猜你理论上可以进来,定义你自己的“java.beans”包并在那里做一些肮脏的事情。但很明显:我们讨论这个问题的时间越长,就会想出如何以一种有意义的方式“利用”这个“特性”;它变得越清晰,它不是一个功能......
  • @GhostCat 我想如果你尝试这样做你会得到一个异常... java.lang.SecurityException: Prohibited package name: java.beans
  • 我相信可以解决这个问题;它只是没有任何意义;-)

标签: java methods implementation


【解决方案1】:

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

这就是特定子类的东西可以注入这个函数的方式。 (尽管对此效果的评论会很好)。

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

【讨论】:

  • 不应该是类抽象吗?
  • 如果你不得不从 String 派生,那可能会很痛苦。
  • 一般来说:是的。但是在这里 - 该方法是包保护的; 无论如何都没有记录。这不是一项功能,而是一个不会造成伤害的错误。
【解决方案2】:

鉴于该实现:

void appendTo(StringBuilder sb) {
}

我认为:这是“剩菜”;打算做某事的人工制品;但只是忘记了。

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

没有有意义的理由来做这样的事情。因此,我的(固执的)回答:这是一个错误;或更准确地说;这是源代码中的错误;但幸运的是,它不会在运行时导致失败。好吧,除非某个可怜的人碰巧扩展了这个类;并且碰巧写了这样一个 appendTo() 方法,它做了一些非常奇怪的事情。

当然,可能做这样的事情;例如,让扩展类能够插入一些自定义元素到toString() 的结果中。但如果这是这个构造的目标;它惨遭失败;因为那没有记录。

【讨论】:

  • 写得非常好的 Java 库代码中的错误?确定不是吗?可悲的是,您可能是正确的。投赞成票。
  • 这么说吧:它是一个错误的一半。按照现在的编写方式,它绝对是不应该存在于该类中的东西。
猜你喜欢
  • 2019-11-10
  • 2019-02-22
  • 2010-09-27
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2021-11-15
相关资源
最近更新 更多