【问题标题】:prevent inheritance of interface outside of package防止在包外继承接口
【发布时间】:2014-08-13 05:43:39
【问题描述】:

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

package foo;

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

    // Prevent classes outside of package foo from inheriting
    Foo()
    {
    }
}

现在 Java 8 支持接口中的默认方法,我想将抽象类转换为接口。使用接口,是否也可以防止当前包之外的继承?

【问题讨论】:

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

标签: java inheritance constructor base-class default-method


【解决方案1】:

来自java tutorial

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

这意味着您不能,除非您将界面可见性限制为包。但我想你不能。

package foo;

interface Foo
{
}

我想你可以写一个自定义注释(一些链接,如@InstanciableOnlyInMyPackage)并将其放在界面上。然后使用 Annotation Processing Tool 引发编译器错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多