这是封装派生类的好方法吗?

时间:2015-05-28 07:19:44

标签: java class

我有以下课程:

public class Base{

    private static class Derived extends Base{ }
    private static class SuperDerived extends Base{ }

    public static Base createDerived(){ return new Derived(); }
    public static Base createSuperDerived(){ return new SuperDerived(); }
}

我不希望这些派生类直接在Base类主体之外使用。

这是一个很好的方法吗?我不确定那个东西,因为派生的那些可能包含100行代码,可能会使Base类难以理解。

4 个答案:

答案 0 :(得分:10)

可能但通常不会。

我主要担心的是你的设计是由恐惧驱使的(“某人可能滥用”)。这可能导致各种问题。有一个类似于太多封装的东西,特别是当你有复杂的代码时,必然会有“我可以在消费者方面使用那个小变化”的错误。

通常,将类标记为内部并且不会非常保护它就足够了。什么是保护无人关心的东西有什么意义?

我还建议不要使用static工厂方法。当你必须编写单元测试时,它会引起各种各样的痛苦。

您的另一个问题是班级规模。如果您仍然感受到保护代码的压力,请将类包保密:

/*package*/ class Derived extends Base { ... }

评论没有效果,但记录了意图(因此没有人认为“哦,有public缺失”。

这样,只有同一个包中的类才能访问它们。

答案 1 :(得分:2)

如果这些类很大,我建议将BaseDerived类放在一个单独的包中,并将Derived类放在单独的文件中,并使它们成为私有包。这样可以提高代码的可读性。

假设您并不太担心恶意开发人员创建该软件包以访问Derived类。

答案 2 :(得分:2)

那么,为什么不让你的派生类分类器少?

class Derrived extends Base {
}

没有public的类或任何分类器只能从其包中访问。所以你不能像protected那样扩展它。它只适用于Derrived类包。

答案 3 :(得分:1)

如果您不希望在Base之外访问它们,那么使它们成为嵌套类几乎是您唯一的选择。

我个人的偏好是嵌套类来到外部类的末尾,这意味着它们不会使你的外部类变得杂乱,使它更具可读性。