只能被自己的类或其他子类调用的Java方法
Posted
技术标签:
【中文标题】只能被自己的类或其他子类调用的Java方法【英文标题】:A Java method that can only be called by its own class or by other subclasses 【发布时间】:2014-01-30 07:20:09 【问题描述】:我希望我的类有一个只能由其自身或其子类调用的方法。
最接近的是protected
访问,但它也允许同一个包中的其他类调用该方法,这是我不想要的。
有没有办法实现这一点,还是我应该考虑进行某种包重构?
在我看来private
不会让子类使用该方法。
【问题讨论】:
切换到 Scala,它将protected
关键字重新定义为您想要的含义 ;-)
还有其他人记得 Java 小时候的 private protected
吗? ***.com/a/903050/831878
【参考方案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(即数字版权管理)系统,而不是简单的代码管理和类“合同”系统,那你就错了。将访问控制关键字视为文档,当其他代码不符合文档所表达的意图时,编译器有能力验证它。
【讨论】:
以上是关于只能被自己的类或其他子类调用的Java方法的主要内容,如果未能解决你的问题,请参考以下文章