0

在 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基类可以计算它已经派生的级别数?

4

4 回答 4

9

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

于 2012-08-08T15:16:56.527 回答
5

introspection 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");
    }

顺便说一句,你为什么要这样做?

于 2012-08-08T15:22:08.850 回答
3

您可以查看 getClass().getSuperclass() 等来检查您的班级不超过 N 个级别。

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

于 2012-08-08T15:17:41.050 回答
0

您可以将 level3 类设为 final,然后它不能被任何类扩展。声明为 final 的类不能被子类化。

于 2012-08-08T15:32:36.293 回答