java如何防止类被派生出两个以上的级别?

时间:2012-08-08 15:13:38

标签: java inheritance

在java中我需要防止Level1类(看下面的示例代码)被派生超过两个级别。导出到Level2和Level3很好,但是如果class是由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基类可以计算它已导出的级别数?

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

内省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");
    }
顺便问一下,你为什么要这样做?

答案 2 :(得分:3)

你可以查看getClass()。getSuperclass()等来检查你的班级不超过N级。

然而,这是一个令人困惑的要求。 :P

答案 3 :(得分:0)

您可以将level3类设为final,然后无法通过任何类进行扩展。声明为final的类不能被子类化。