【问题标题】:Java: How to create a public class that can be subclassed within package, while preventing outsiders from inheriting?Java:如何创建一个可以在包内子类化的公共类,同时防止外人继承?
【发布时间】:2018-12-10 05:07:22
【问题描述】:

假设我正在编写一个包。我的包中有以下继承层次结构:

public class Container {
    public void size() {
        System.out.println(10);
    }
}

public final class Bucket extends Container {}

public final class Bag extends Container {}

public class Item {
    Container container; // is aware of what container it's in. Will be initialized on construction.
    public Container getContainer() {
        return container;
    } 
}

我想阻止其他人继承Container。但我无法做到final,因为BucketBag 是子类。而且我必须做到public,否则外人无法拨打getContainer()。有没有办法在 Java 中做到这一点?否则,人们在这种情况下会怎么做?

【问题讨论】:

  • 所以为了澄清你可能会问什么......你想要一个名为 Container 的类,它有两个且只有两个子类,分别称为 BucketBag,对吗?跨度>
  • 是的。我刚刚意识到,为了防止它在外部被子类化,我能想到的最接近的方法是使Container 的构造函数包私有。这听起来合理吗?
  • 听起来确实很合理。

标签: java inheritance subclass access-modifiers


【解决方案1】:

为了防止一个类被其他包中的类子类化,请将所有构造函数设为package-private

如果类没有任何构造函数,它有implicit default constructor,它是公共的,所以你需要显式创建一个包私有的无参数构造函数。

package foo;
public class Container {
  Container () {/*package-private*/}
  public void size() { System.out.println(10); }
}

package foo;
public final class Bucket extends Container {}

package bar;
public final class Oops extends Container {}

编译错误: 隐式超级构造函数 Container() 对于默认构造函数不可见。必须定义显式构造函数


public final class Oops extends Container {
  public Oops() {}
}

编译错误: 隐式超级构造函数 Container() 不可见。必须显式调用另一个构造函数

当然,没有其他构造函数,所以做不到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 2017-02-13
    • 1970-01-01
    • 2015-08-09
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多