【问题标题】:Disallow subclasses from overriding Java method禁止子类覆盖 Java 方法
【发布时间】:2012-10-12 20:31:55
【问题描述】:

假设我在 Java 类中有一个方法,并且我不希望该类的任何子类能够覆盖该方法。我可以这样做吗?

【问题讨论】:

    标签: java class methods subclass


    【解决方案1】:

    您可以将方法声明为final,如:

    public final String getId() {
       ...
    }
    

    更多信息请见http://docs.oracle.com/javase/tutorial/java/IandI/final.html

    【讨论】:

    • 这么明显,我怎么没想到呢?
    • 在使用“JavassistLazyInitializer”时可能会导致问题。 forum.hibernate.org/viewtopic.php?f=1&t=997278
    • 注意,这会导致 Spring @Component 出现问题:子类是继承自非组件父类的 @Component,并且该父类至少有一个 final 方法。此方法不会被包装到代理对象中,并且在处理本应使用非空值初始化的属性时可能会引发异常,因此您可能会得到 NullPointerException
    【解决方案2】:

    只需将方法设为 final

    【讨论】:

      【解决方案3】:

      如果您的方法不是您构建的 API 的一部分并且不被子类直接调用,则更愿意简单地将您的方法设为 private

      如果您的类层次结构包含在单个包中,请将您的方法置于包范围内(没有范围关键字)。因此,只有外部世界(包括您自己的其他包)无法访问它,因此无法覆盖它。

      如果您的方法实际上不是 API 的一部分,但必须由子类甚至外部可见,最好将其设为 protectedfinal

      最后,如果您的方法是 API 的一部分,请将其设为 publicfinal

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-11
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        • 2011-05-21
        相关资源
        最近更新 更多