java如何防止类派生超过两个级别?

java如何防止类派生超过两个级别?,java,inheritance,Java,Inheritance,在java中,我需要防止为两个以上的级别派生Level1类(查看下面的示例代码)。派生到Level2和Level3是可以的,但若类是由Level4派生的,那个么应该抛出异常。请看下面的代码示例 代码示例: class Level1 { private int level = 1; protected Level1() throws RuntimeException { level++; //System.out.println(level);

在java中,我需要防止为两个以上的级别派生Level1类(查看下面的示例代码)。派生到Level2和Level3是可以的,但若类是由Level4派生的,那个么应该抛出异常。请看下面的代码示例

代码示例:

class Level1 {
    private int level = 1;

    protected Level1() throws RuntimeException {
        level++;
        //System.out.println(level);
        if (level > 2) {
            throw new RuntimeException("Can't implement more than 2 levels");
        }
    }
}

class Level2 extends Level1 {
    protected Level2() {
    }
}

class Level3 extends Level2 {
    Level3() {
    }
}

class Level4 extends Level3 {
    Level4() {
    }
}
从上面的代码示例中,我并没有提出使用静态int级别计数器的解决方案。我只是想解释一下这个问题


在Java中,通过实现一些逻辑或使用一些API,Level1基类可以计算其派生的级别数,这是可能的吗?

您可以在构造函数中使用反射并遍历此.getClass()的继承链以查看嵌套级别。实际上,这个.getClass().getSuperClass()==Level1.class的测试应该已经完成了。

您可以查看getClass().getSuperClass()等,检查您的类的级别是否不超过N级


然而,这是一个令人费解的要求P

内省api可以帮助您解决这个问题,请尝试以下方法:

protected Level1() throws RuntimeException {
        if (getClass().equals(Level1.class)) {
            return;
        }

        if (getClass().getSuperclass().equals(Level1.class)) {
            return; // first level or inheritance
        }

        if (getClass().getSuperclass().getSuperclass().equals(Level1.class)) {
            return; // second level or inheritance
        }
        // else
        throw new RuntimeException("Can't implement more than 2 levels");
    }

顺便问一下,你为什么要这样做?

你可以让三级课程成为最终课程,那么它就不能被任何课程扩展。声明为final的类不能被子类化。

这背后的动机是什么?你应该解释这样做的动机,否则你的问题可能会被关闭。Giant-mega-WTF-Code闻到这一点,对一个扭曲的设计发出尖叫。你在寻找工厂模式吗?这真是个奇怪的要求。。除了你记录最后一级的课程,让它们成为“巨人元等”的最后一级课程。是的,这将非常有效。反射应该作为最后手段使用…但是使用它有非常有效的案例。但是如果派生类实现其构造函数而不调用
super()
?@SJuan76:这在Java中是不可能的,你总是需要调用超级构造函数,只有字节码技巧可以解决这个问题,你是对的。我的想法是,既然您可以显式调用
super()
,那么如果您不这样做,就不会调用父构造函数。如果构造函数中没有
super()
(带参数或不带参数),则Java会添加它。这可能是错误的设计实践。在讨论中,我们只是想让基类(在本例中是Level1)控制它是如何派生的,而无需使用传统的java编码方法,方法是将类设置为final或将类构造函数设置为private。感谢您的答案和代码解决方案。