jbu*_*jbu 27 java interface access-specifier
我知道界面必须是公开的.但是,我不希望这样.
我希望我的实现方法只能从他们自己的包中访问,所以我希望我的实现方法受到保护.
问题是我无法使接口或实现的方法受到保护.
什么是解决方法?是否存在与此问题相关的设计模式?
从Java指南中,抽象类也不能完成这项工作.
kdg*_*ory 11
您的类可以使用包保护并仍然实现一个接口:
class Foo implements Runnable
{
public void run()
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果您希望某些方法受到保护/打包而其他方法不受保护,则听起来您的课程有多个职责,应该分成多个.
阅读此评论和其他回复后编辑:
如果您以某种方式认为方法的可见性会影响调用该方法的能力,请再想一想.在没有走极端的情况下,您无法阻止某人使用反射来识别您的类的方法并调用它们.但是,这不是问题:除非有人试图破解您的代码,否则他们不会调用随机方法.
相反,将private/protected方法视为定义子类的契约,并使用接口来定义与外部世界的契约.
哦,对于决定我的例子的人应该使用K&R支撑:如果它在服务条款中规定,当然.否则,你不能找到更好的时间吗?
当我遇到这种情况时,我使用一个包可访问的内部或嵌套类来实现接口,将实现的方法推出公共类.
通常这是因为我有一个具有特定公共API的类,它必须实现其他东西以完成它的工作(通常因为其他东西是伪装成接口<grin>的回调) - 这种情况发生在像Comparable这样的事情上.我不希望公共API被(强制公共)接口实现污染.
希望这可以帮助.
此外,如果您确实希望仅由包访问的方法,则不需要受保护的范围说明符,您需要默认(省略)范围说明符.当然,使用protected will会允许子类查看方法.
顺便说一句,我认为界面方法被推断为公共的原因是因为拥有一个只在同一个包中的类实现的接口是非常例外的.它们通常被另一个包中的某些东西调用,这意味着它们需要公开.
您可以使用封装而不是继承。
也就是说,创建您的类(不会继承任何内容)并在其中包含您要扩展的对象的实例。
然后你就可以只公开你想要的内容。
这样做的明显缺点是您必须显式传递您想要公开的所有内容的方法。而且它不会是一个子类......