![](/img/trans.png)
[英]Can I force the type of a variabile in a extended class to a subtype in Java?
[英]JAVA: How can I restrict a class to be extended on one level
我的问题陈述如下:
我正在用Java创建一个库,对于某些类,我希望用户应该能够扩展我的类,但是仅在一个级别上,那些子类不应用于子类化。 如果将其子类编程为final,则可以实现,但决定权将由他们决定。 我想从我的图书馆进行控制。 我怎样才能做到这一点 ?
任何帮助,将不胜感激
我想您可以通过反射来实现这样的事情:
public abstract class ExtendOnce {
public static class Subclass extends ExtendOnce {
}
public static class SubSubclass extends Subclass {
}
protected ExtendOnce() {
if (!getClass().getSuperclass().equals(ExtendOnce.class)) {
throw new RuntimeException(
"You extended this class more than once!");
}
}
public static void main(String[] args) {
System.out.println(new Subclass());
System.out.println(new SubSubclass()); // throws exception
}
}
但是,您需要问自己的更重要的问题是您是否真的需要此限制?
您可以使用Java反射API并调用getModifiers()来检查该类是否为最终类。
您可能可以从您的超类构造函数中执行此操作。 如果不是,则必须选择一些需要调用的方法。 如果检测到它不是最终的,则可以引发异常,退出JVM或执行其他任何操作以使其无法正常工作。
但是,我无法想象这样做的充分理由。 作为您图书馆的用户,这种随意的限制会让我烦恼。
同样,您的库用户始终可以将您的对象包装在自己的对象中,并通过合成而不是继承来扩展它。
这很简单。 只需写下许可条款。
如果您的软件有用,那么您的要求很特殊,但不会破坏交易。 例如,我宁愿接受您的要求,也不愿花钱。
如果您的软件没有用,那么您的要求是不寻常的,但不会破坏交易。 没有人会在意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.