繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM