【问题标题】:A Java method that can only be called by its own class or by other subclasses只能被自己的类或其他子类调用的Java方法
【发布时间】:2014-01-30 07:20:09
【问题描述】:

我希望我的类有一个只能由其自身或其子类调用的方法。

最接近的是protected访问,但它也允许同一个包中的其他类调用该方法,这是我不想要的。

有没有办法实现这一点,还是我应该考虑进行某种包重构?

在我看来private 不会让子类使用该方法。

【问题讨论】:

  • 切换到 Scala,它将 protected 关键字重新定义为您想要的含义 ;-)
  • 还有其他人记得 Java 小时候的 private protected 吗? stackoverflow.com/a/903050/831878

标签: java class methods protected


【解决方案1】:

In Java, difference between default, public, protected, and private

没有这样的事情。但是你可以将类移动到一个空包中并使用protected

【讨论】:

    【解决方案2】:

    简答:重构你的包

    解释:

    Java 规范认为package 关系比subclass 关系更密切。这是因为我可以扩展任何类,只要我导入它。

    如果您想确保即使包外的子类也无法访问该方法,请使用default 可见性修饰符。

    Source

    Stack Overflow reference

    【讨论】:

      【解决方案3】:

      要做到这一点,请将您的类放在自己的包中,并使方法成为默认保护。包中不会有任何其他类可以看到它通过包访问来调用它。

      还请考虑,如果您 seal the jar 该类在其中,则只有您控制给定包中的内容,并有效地锁定了任何其他人,无法在您定义的包中创建类 - 没有其他人能够将一个类引入包中并打破封装。

      【讨论】:

      • 但是,“密封”一个 jar 文件并不能阻止某人提取文件的内容,将自己的类添加到一个包中,然后在自己的代码中使用该组合,无论该组合是否用作单独的文件或将文件捆绑到一个新的 jar 文件之后......可能是密封的......当然,这不是真正的问题,除非有人认为包、访问关键字或“密封”jar 正在做出某种保证,它们不是.
      • 这种技术使得无法对类进行子类化,这违反了问题的条款。 -1
      • @ejp 您是否将密封罐子与最终课程混淆了?
      • @MichaelT 这个问题很荒谬。
      【解决方案4】:

      抱歉,如果您希望子类能够调用或覆盖方法而不使其成为public,那么protected 是您唯一的选择。如果出于某种原因您不希望同一包中的其他类具有访问权限,请将您的类移动到新包中。但如果你认为包和访问控制关键字形成某种 DRM(即数字版权管理)系统,而不是简单的代码管理和类“合同”系统,那你就错了。将访问控制关键字视为文档,当其他代码不符合文档所表达的意图时,编译器有能力验证它。

      【讨论】:

        猜你喜欢
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-22
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        相关资源
        最近更新 更多