0

我的问题陈述如下:

我正在用 java 创建一个库,对于某些类,我希望用户应该能够扩展我的类,但仅在一个级别上,这些子类不应该可用于子类化。如果将他们的子类编程为最终的,则可以实现,但决定权将交给他们。我想从我的图书馆控制它。我怎样才能做到这一点 ?

任何帮助,将不胜感激

4

3 回答 3

11

我想你可以用反射来实现这样的东西:

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
    }
}

然而,你需要问自己的更重要的问题是你真的需要这个限制吗?

于 2012-06-12T04:12:54.753 回答
3

您可以使用Java 反射 API并调用getModifiers()来检查该类是否为最终类。

您可能可以从您的超类构造函数中执行此操作。如果没有,您将不得不选择一些需要调用的方法。如果你检测到它不是最终的,你可以抛出一个异常,退出 JVM,或者你想做的任何其他事情来阻止它工作。

但是,我无法想象这样做的充分理由。作为您图书馆的用户,我会对这种任意限制感到恼火。

此外,您的库的用户总是可以将您的对象包装在他们自己的对象中,并通过组合而不是继承来扩展它。

于 2012-06-12T04:14:13.550 回答
-2

这很简单。只需写下许可条款。

如果您的软件有用,那么您的要求是不寻常的,但不会破坏交易。例如,我宁愿接受你的要求,也不愿花钱。

如果您的软件没用,那么您的要求是不寻常的,但不会破坏交易。没人会在意。

于 2012-06-12T04:29:55.640 回答