如何限制匿名子类(Java)的创建

时间:2010-04-22 15:50:46

标签: java inheritance anonymous

对不起,我之前没有正确说明这个问题。我尝试实现工厂模式。一个更好的例子:它是一个带有函数create的抽象类Human。根据传递给它的参数创建它决定是否返回其子类Man的实例或子类Woman的实例。所以你用以下方法调用create: Human john = Human.create("Man"); 子类Man和Woman继承自抽象类Human,并在与Human相同的文件中定义。我不希望它可以通过以下方式扩展它:Human lisa = new Human("woman") {};来自主程序。谢谢!

编辑:

感谢您的帮助!我最终使用的解决方案是让人类公开,以及它的功能创建。 Human构造函数和Man and Woman类被声明为“受包保护”。

2 个答案:

答案 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");
  }