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