如何仅允许在同一个包中实现接口

时间:2012-10-26 16:35:15

标签: java interface package visibility multiple-inheritance

我有一个包P

  • public interface I
  • public class S1 extends Foo implements I
  • public class S2 extends Bar implements I

现在我想禁止在I之外的P实施,但I应该是公开的,因为我将其用于public method(I parameter)

如何做到这一点?

这是否有一些“包最终模式”?

你有过这样的情况吗?


详细信息:

我知道使用只有包私有构造函数而不是接口I的抽象类的可能性,但是S1S2扩展了不同的类,所以我需要多个继承(因为模拟的多重继承(参见例如Effective Java item 18)在这里不起作用)。

3 个答案:

答案 0 :(得分:7)

您还可以尝试以下尝试:

使用虚拟包私有接口并在公共接口中创建一个返回它的方法。像这样:

public interface I {
  Dummy getDummy(); // this can only be used and implemented inside of the 
                    // current package, because Dummy is package private
  String methodToUseOutsideOfPackage();
}

interface Dummy {}

由于这个原因,只有当前包中的类才能实现接口I。来自外部的所有类将永远无法实现方法Dummy getDummy()。同时,包外部的类将能够使用其签名中没有I接口的接口Dummy的所有其他方法。

这个解决方案并不漂亮,因为你的界面I中有一个无用的方法,但你应该能够达到你想要的效果。

答案 1 :(得分:4)

不能这样做。如果您的界面是public,那么任何人都可以实施。您的两个实现是否可以扩展抽象类并封装它们当前正在扩展的类?

更好的问题是,您真的需要执行此规则。接口的关键是您应该能够接受和实现接口。如果你真的需要,你可以通过检查实例的类是你允许的两个中的一个来在接口的使用点进行验证。

答案 2 :(得分:0)

如果你进行了接口声明,它应该只能从包和类中访问

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html