3

我想知道一些程序,通过它我可以限制java中给定类的多个子类。

例如,如果我有 A 类,那么只有一个类可以扩展 A,即不允许超过 1 个子类。

我在公司面试中被问到这个问题,非常感谢一些帮助或指导。

4

5 回答 5

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 类之外创建更多子类,因为构造函数不可见......

于 2012-10-29T19:20:26.103 回答
0

您可以使用工厂设计模式为类的层次结构创建实例,并使用一个静态计数器来表示实例的数量。当数量超过您的需要时,在工厂方法上抛出异常。

于 2012-10-29T19:18:45.810 回答
0

当您尝试创建使用工厂的子类时会怎样。工厂可以保留某种计数器或逻辑来确定是否允许创建一个类。如果确定无法创建该类,则抛出异常。

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");
    }
}
于 2012-10-29T19:19:44.947 回答
0

您不能在编译器级别对此进行限制。您可以在运行时“某种程度地”限制它。创建将包含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。另一个解决方案是拦截类加载器,以便在运行时捕获加载的类。如果您正在开发独立应用程序,则可以通过编程方式控制类加载器,或者如果您无法直接访问类加载器,则可以使用检测包来控制类加载器。

我相信我在这里提到了你的面试官不知道的技术...... :)

于 2012-10-29T19:22:56.730 回答
0

假设您谈论的是类本身而不是类实例,我认为您唯一能做的就是让您想要限制的类有一个私有构造函数并将(一个也是唯一的)子类声明为嵌套类。

于 2012-10-29T19:22:57.957 回答