Java: 如何创建一个 public class 可以在包内被子class,同时防止外人继承?

Java: How to create a public class that can be subclassed within package, while preventing outsiders from inheriting?

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

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 中有没有办法做到这一点?否则,人们在这种情况下会做什么?

为了防止 class 被其他包中的 class 子class 编辑,使所有构造函数 package-private .

如果class没有任何构造函数,它有implicit default constructor,也就是public,所以你需要显式地创建一个包私有的无参数构造函数.

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() 不可见。必须显式调用另一个构造函数

当然没有其他的构造器,所以做不到