JAVA:如何限制在一个级别上扩展类

时间:2012-06-12 04:03:34

标签: java design-patterns inheritance

我的问题陈述如下:

我在java中创建一个库,对于某些类我希望用户应该能够扩展我的类,但只能在一个级别上,这些子类不应该可用于子类。如果程序员将他们的子类作为最终,那么可以实现,但决定将转向他们。我想从我的图书馆控制这个。我怎么能这样做?

任何帮助将不胜感激

3 个答案:

答案 0 :(得分: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
    }
}

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

答案 1 :(得分:3)

您可以使用Java reflection API并致电getModifiers()查看该课程是否为最终课程。

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

但是,我无法想象这是一个很好的理由。作为你图书馆的用户,我会被这种任意限制所困扰。

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

答案 2 :(得分:-2)

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

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

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