【问题标题】:How do I restrict the creation of an anonymous subclass (Java)如何限制匿名子类的创建(Java)
【发布时间】:2010-04-22 15:50:45
【问题描述】:

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

编辑:

感谢大家的帮助!我最终使用的解决方案是让类 Human 公开,以及它的函数 create。 Human 构造函数和 Man 和 Woman 类被声明为“包保护”。

【问题讨论】:

  • 您希望在 P 之外为 A 创建一个命名子类吗?
  • 不,我不能没有那个,正如你现在看到的,我已经编辑了我的问题,我只想使用 create 在包中创建子类的元素。

标签: java inheritance anonymous


【解决方案1】:

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

编辑以反映相关变化:

选项 1: 将 Human 包的构造函数设为私有。通过这样做,任何试图在包外扩展 Human 的类都会失败,因为它不能调用超类的构造函数。

选项 2: 坚持我最初关于包私有类的建议,改用公共访问工厂类。

【讨论】:

  • 对不起,这个问题是我正确陈述的。我尝试实现工厂模式。一个更好的例子:它是一个带有 create 函数的抽象类 Human。根据传递给创建的参数,它决定是返回其子类 Man 的实例还是子类 Woman 的实例。所以你调用 create : Human john = Human.create("Man");子类 Man 和 Woman 继承自抽象类 Human,并在与 Human 相同的文件中定义。我不希望它可以通过以下方式扩展它: Human lisa = new Human("woman") {};从主程序。谢谢!
  • 对不起,它应该说“没有正确说明”... :-)
  • 您应该编辑您的问题以反映您在此处所说的内容,而不仅仅是回复评论。
【解决方案2】:

这取决于您所说的不可能。如果您希望静态强制执行,唯一的方法是使类包访问,但这并没有专门限制匿名类 - 它也限制了命名类。如果想在运行时强制执行,可以在抽象类的构造函数中执行

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

【讨论】:

  • 我的问题表述得很糟糕,非常抱歉因此而浪费您的时间。但是,如果您阅读了我回复第一个答案的评论,我希望我能够以更好的方式描述我的问题。不过,这是一种非常酷的方法。干杯!
  • 这个解决方案很好用,谢谢。我只需要使用“if (this.getClass().isAnonymousClass())”部分来实现我想要的。
  • 在编译时出现错误当然很好。
猜你喜欢
  • 1970-01-01
  • 2015-02-18
  • 2011-04-30
  • 2011-04-13
  • 2023-04-08
  • 2017-06-07
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多