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

如何限制匿名子类(Java)的创建,java,inheritance,anonymous,Java,Inheritance,Anonymous,对不起,我之前没有正确地回答这个问题。我试图实施工厂模式。一个更好的例子:它是一个抽象类Human,带有一个create函数。根据传递给create的参数,它决定是返回其子类Man的实例还是返回子类Woman的实例。因此,您可以调用create with: Human john=Human.create(“人”) 子类Man和Woman继承自抽象类Human,并在与Human相同的文件中定义。我不希望通过以下方式扩展它:humanlisa=newhuman(“woman”){}来自主程序。谢谢

对不起,我之前没有正确地回答这个问题。我试图实施工厂模式。一个更好的例子:它是一个抽象类Human,带有一个create函数。根据传递给create的参数,它决定是返回其子类Man的实例还是返回子类Woman的实例。因此,您可以调用create with:
Human john=Human.create(“人”)
子类Man和Woman继承自抽象类Human,并在与Human相同的文件中定义。我不希望通过以下方式扩展它:
humanlisa=newhuman(“woman”){}来自主程序。谢谢

编辑:


谢谢你的帮助!我最后使用的解决方案是让类Human公开,以及它的函数create。人工构造函数和男女类被声明为“包受保护”。

不要在类声明中为a使用可见性说明符,它将是一个包访问类

编辑以反映有问题的更改:

备选案文1: 将人工包的构造函数设为私有。通过这样做,任何试图在包外部扩展人员的类都将失败,因为它无法调用超类的构造函数

备选案文2:
坚持我最初建议的包私有类,使用公共访问工厂类。

这取决于您所说的不可能是什么意思。如果您希望静态强制,唯一的方法是让类包访问,但这并不特别限制匿名类,它还限制命名类。如果希望在运行时强制执行,可以在抽象类的构造函数中执行

 if (this.getClass().isAnonymousClass() && !this.getClass().getName().startsWith(packageName)) {
     throw new IllegalStateException("This class cannot be used as an anonymous inner class");
  }

你想为P之外的创建一个命名的子类吗?不,我可以不这样做,因为你可以看到,现在我已经编辑了我的问题,我只想使用create在包中创建子类的元素。对不起,我正确地陈述了这个问题。我试图实施工厂模式。一个更好的例子:它是一个抽象类Human,带有一个create函数。根据传递给create的参数,它决定是返回其子类Man的实例还是返回子类Woman的实例。所以你称之为create with:humanjohn=Human.create(“人”);子类Man和Woman继承自抽象类Human,并在与Human相同的文件中定义。我不想把它扩展为:humanlisa=新人类(“女人”){};从主程序。谢谢再次抱歉,它应该说“未正确声明”…:-)你应该修改你的问题以反映你在这里所说的,而不是仅仅回复评论。我的问题陈述得很糟糕,非常抱歉因此浪费你的时间。但是如果你读了我对第一个答案的回复,我希望我能以更好的方式描述我的问题。不过,这是一种非常酷的方式。干杯此解决方案非常有效,谢谢。我只需要使用“if(this.getClass().isAnonymousClass())”部分就可以实现我想要的功能。当然,如果在编译时出现错误就好了。