java如何防止类派生超过两个级别?
在java中,我需要防止为两个以上的级别派生Level1类(查看下面的示例代码)。派生到Level2和Level3是可以的,但若类是由Level4派生的,那个么应该抛出异常。请看下面的代码示例 代码示例: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);
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。感谢您的答案和代码解决方案。