2

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

编辑:

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

4

2 回答 2

1

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

编辑以反映问题的变化:

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

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

于 2010-04-22T16:14:34.577 回答
0

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

 if (this.getClass().isAnonymousClass() && !this.getClass().getName().startsWith(packageName)) {
     throw new IllegalStateException("This class cannot be used as an anonymous inner class");
  }
于 2010-04-22T16:20:45.207 回答