如何在子类中覆盖final方法的javadoc?

5
public class BaseClass {
    /**
     * Gets the value.
     */
    public final String getValue() {
        // returns something.
    }
}

public class SubClass extends BaseClass {
    /**
     * Gets the value.
     * <p/>
     * The value is meaningless for SubClass.
     */
    @Override // Cannot override final method
    public final String getValue() {
        super.getValue(); // Not overriding implementation, just javadoc
    }
}

我不需要改变最终方法的实现,只想为它更改 Javadoc。


2
“对于SubClass来说,这个值是没有意义的。” 这告诉我们子类不应该成为一个子类,因为它未通过“is a”测试。如果这个值对于BaseClass有意义,那么它对于SubClass也应该有意义,因为SubClass旨在成为BaseClass(加上)。为BaseClass编写的代码,可能会期望value具有意义,并且应该与SubClass一起工作。也许您想要组合而不是继承。 - T.J. Crowder
1
好吧...你不能。为什么不把解释放到类的文档中呢? - Seelenvirtuose
你的问题毫无意义。你不能覆盖该方法,那么你为什么想要覆盖它的文档呢? - user207421
请注意:我稍微修改了问题标题 - 没有必要再次提及编程语言(这就是标签的作用!) - GhostCat
@T.J.Crowder 嗯,有时我们会子类化一个API类,但我们想要进行一些小技巧,这会导致原始类中的某些内容变得无用。当然,在正常的理想编程实践下,这不应该发生或者至少不被推荐。 - Jai
2个回答

7
简单来说,你不能这样做。如果一定要这样,你可以在那个子类的定义处放一些javadoc,解释那个final方法的行为已经改变了。如果你这样做了,你可以更改基类的javadoc,写上“子类可能使此方法无效”或类似的内容。
除此之外,你应该明白,这也是一个值得商榷的想法。继承并不主要是为了代码重用,而是为了表达某个类A 是一个 B,因为A扩展了B。所以当你决定在子类上使一个方法变得毫无意义时,你基本上是使超类的约定无效。这并不是良好的实践(参见Liskov替换原则,以了解在修改继承方法的约定时需要小心的原因)。
你看,那个关键字 final 不仅是给编译器的信息,它还表达了使用该方法的人的意图。这个人说:“我不想让子类用这个方法来干扰它!”

2
特别是方法被声明为“final”,这意味着没有子类可以通过重载它来搞事情。 - fhossfel

2
这在Java中没有预见到,因此使用标准Java工具不可能实现。您可以在类级别提供更详细的解释。您还可以尝试查看Javadoc API(Doclet API)并搜索一些自定义实现或实现自己的扩展,例如,在类级别引入新注释,并实现自定义Javadoc生成器以遵守这些规则。但我不确定是否已经存在这样的东西。更新:还请参阅GhostCat答案,他列举了许多原因,说明为什么不应该这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接