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



我有一个P

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

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

如何做到这一点?

是否有一些"包最终模式"?

你有过这样的情况吗?


详:

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

您也可以尝试以下尝试:

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

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中有一个无用的方法,但你应该能够实现你想要的。

做不到。如果您的接口public任何人都可以实现。您的两个实现是否可以扩展抽象类并封装它们当前正在扩展的抽象类?

更好的问题是你真的需要执行这个规则吗?接口的要点是您应该能够接受和实现接口。如果确实需要,可以在接口的使用点进行验证,方法是检查实例的类是否是您允许的两个类之一。

如果你使界面

interface I

它应该使其只能从包和类访问

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