对不起,我之前没有正确说明这个问题。我尝试实现工厂模式。一个更好的例子:它是一个带有函数create的抽象类Human。根据传递给它的参数创建它决定是否返回其子类Man的实例或子类Woman的实例。所以你用以下方法调用create:
Human john = Human.create("Man");
子类Man和Woman继承自抽象类Human,并在与Human相同的文件中定义。我不希望它可以通过以下方式扩展它:Human lisa = new Human("woman") {};
来自主程序。谢谢!
编辑:
感谢您的帮助!我最终使用的解决方案是让人类公开,以及它的功能创建。 Human构造函数和Man and Woman类被声明为“受包保护”。
答案 0 :(得分:1)
不要在A的类声明中使用可见性说明符,它将是一个包访问类。
修改以反映有问题的变化:
选项1: 使Human包的构造函数为private。通过这样做,任何试图将Human扩展到包之外的类都将失败,因为它无法调用超类的构造函数。
选项2: 坚持我对包私有类的原始建议,而是使用公共访问工厂类。
答案 1 :(得分:0)
这取决于你不可能的意思。如果您希望静态强制执行,那么唯一的方法是使类包访问,但这并不特别限制匿名类 - 它也限制了命名类。如果要在运行时强制执行它,可以在抽象类
的构造函数中执行此操作 if (this.getClass().isAnonymousClass() && !this.getClass().getName().startsWith(packageName)) {
throw new IllegalStateException("This class cannot be used as an anonymous inner class");
}