我的问题陈述如下:
我正在用 java 创建一个库,对于某些类,我希望用户应该能够扩展我的类,但仅在一个级别上,这些子类不应该可用于子类化。如果将他们的子类编程为最终的,则可以实现,但决定权将交给他们。我想从我的图书馆控制它。我怎样才能做到这一点 ?
任何帮助,将不胜感激
我的问题陈述如下:
我正在用 java 创建一个库,对于某些类,我希望用户应该能够扩展我的类,但仅在一个级别上,这些子类不应该可用于子类化。如果将他们的子类编程为最终的,则可以实现,但决定权将交给他们。我想从我的图书馆控制它。我怎样才能做到这一点 ?
任何帮助,将不胜感激
我想你可以用反射来实现这样的东西:
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,或者你想做的任何其他事情来阻止它工作。
但是,我无法想象这样做的充分理由。作为您图书馆的用户,我会对这种任意限制感到恼火。
此外,您的库的用户总是可以将您的对象包装在他们自己的对象中,并通过组合而不是继承来扩展它。
这很简单。只需写下许可条款。
如果您的软件有用,那么您的要求是不寻常的,但不会破坏交易。例如,我宁愿接受你的要求,也不愿花钱。
如果您的软件没用,那么您的要求是不寻常的,但不会破坏交易。没人会在意。