Java 防止在包外部继承接口

Java 防止在包外部继承接口,java,inheritance,constructor,base-class,default-method,Java,Inheritance,Constructor,Base Class,Default Method,我有一个无状态抽象基类,不应从其包外部继承: package foo; public abstract class Foo { // some abstract methods // one concrete method // no state // Prevent classes outside of package foo from inheriting Foo() { } } 既然Java8支持接口中的默认方法,我想将抽象类转

我有一个无状态抽象基类,不应从其包外部继承:

package foo;

public abstract class Foo
{
    // some abstract methods
    // one concrete method
    // no state

    // Prevent classes outside of package foo from inheriting
    Foo()
    {
    }
}
既然Java8支持接口中的默认方法,我想将抽象类转换为接口。使用接口,是否也可以防止继承当前包之外的内容?

来自:

。。接口中的所有抽象、默认和静态方法都是隐式公共的,因此可以省略公共修饰符

这意味着,除非将接口可见性限制为包,否则不能。但我想你不能

package foo;

interface Foo
{
}


我想您可以编写一个自定义注释(像
@instanceableonlyinmypackage
)并将其放在接口上。然后使用引发编译器错误。

您可以拥有包专用接口(当然,包外的任何人都不能调用它)。@Thilo
Foo
本身在我的情况下必须是公共的。是否有机会拆分为公共接口和内部接口(内部接口上有默认方法)?内部仍然可以扩展公共接口。为什么要阻止继承?安全还是设计?我不认为有一个简洁明了的解决方案(也就是说,没有一个解决方案不涉及黑客的扭曲,比如添加一个“虚拟方法”,它期望包私有类作为一个参数)。在本文中,我指出这样的情况是仍然存在的使用抽象类的少数理由之一。