我想知道一些可以限制java中给定类的多个子类的过程。
e.g。如果我有A类,那么只有一个类可以扩展A,即允许不超过1个子类。
我在公司的采访中被问过这个问题,非常感谢你的帮助或指导。
答案 0 :(得分:3)
您可以通过Sujay链接的机制阻止任何人使用多个子类(请参阅注释)。超类构造函数/方法可以跟踪调用它们的子类,记住第一个,如果使用另一个子类则抛出异常。不是很优雅,可能不是很有用(但这是面试问题)。
更新:这就是你所追求的(来自http://www.drmaciver.com/2007/09/how-to-create-sealed-classes-in-java/)?
public class Sealed
{
private Sealed() { }
public final static class Foo extends Sealed {
public Foo() { }
}
}
您无法在Sealed类之外创建更多子类,因为构造函数不可见......
答案 1 :(得分:1)
您无法在编译器级别对此进行限制。您可以“在运行时”对此进行“限制”。创建包含Class
子项的静态变量。该变量将由基类的构造函数更新。如果实例化了其他子节点,则构造函数将抛出异常:
class Base {
private static Class<? extends Base> childClass = null;
protected Base() {
if (childClass == null) {
childClass = this.getClass();
}
if (!childClass.equals(this.getClass())) {
throw new IllegalStateException("More than one child");
}
}
}
其他解决方案可能是扫描应用程序类路径并查找扩展Base
的所有类。
另一种解决方案是拦截类加载器,以便在运行时捕获加载的类。如果您正在开发独立应用程序或使用检测包(如果您没有直接访问类加载器),则可以以编程方式控制类加载器。
我相信我在这里提到了你的工作人员不知道的技术...... :)
答案 2 :(得分:0)
您可以使用工厂设计模式为类层次结构创建实例,并使用静态计数器表示实例数。如果数量超出您的需要,请在工厂方法上抛出异常。
答案 3 :(得分:0)
当您尝试创建使用Factory的子类时,该怎么办?工厂可以保留某种计数器或逻辑来确定是否允许创建类。如果确定无法创建类,则抛出异常。
try {
ChildClass childClass = ChildFactory.createChild();
} catch (ChildCreateionException e) {
...
}
class ChildFactory {
public static final int MAX_CHILDREN = 2;
public static int numChildren = 0;
public ChildClass createChild() throws ChildCreationException {
if (numChildren < MAX_CHILDREN) {
numChildren++;
return new ChildClass();
}
throw new ChildCreationException("Exceeded maximum number of child classes");
}
}
答案 4 :(得分:0)
假设您正在讨论类本身而不是类实例, 我认为你唯一能做的就是让你想要限制的类有一个私有构造函数,并将(一个也是唯一的)子类声明为一个嵌套类。