我有以下课程:
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类难以理解。
答案 0 :(得分:10)
可能但通常不会。
我主要担心的是你的设计是由恐惧驱使的(“某人可能滥用”)。这可能导致各种问题。有一个类似于太多封装的东西,特别是当你有复杂的代码时,必然会有“我可以在消费者方面使用那个小变化”的错误。
通常,将类标记为内部并且不会非常保护它就足够了。什么是保护无人关心的东西有什么意义?
我还建议不要使用static
工厂方法。当你必须编写单元测试时,它会引起各种各样的痛苦。
您的另一个问题是班级规模。如果您仍然感受到保护代码的压力,请将类包保密:
/*package*/ class Derived extends Base { ... }
评论没有效果,但记录了意图(因此没有人认为“哦,有public
缺失”。
这样,只有同一个包中的类才能访问它们。
答案 1 :(得分:2)
如果这些类很大,我建议将Base
和Derived
类放在一个单独的包中,并将Derived
类放在单独的文件中,并使它们成为私有包。这样可以提高代码的可读性。
假设您并不太担心恶意开发人员创建该软件包以访问Derived
类。
答案 2 :(得分:2)
那么,为什么不让你的派生类分类器少?
class Derrived extends Base {
}
没有public
的类或任何分类器只能从其包中访问。所以你不能像protected
那样扩展它。它只适用于Derrived
类包。
答案 3 :(得分:1)
如果您不希望在Base
之外访问它们,那么使它们成为嵌套类几乎是您唯一的选择。
我个人的偏好是嵌套类来到外部类的末尾,这意味着它们不会使你的外部类变得杂乱,使它更具可读性。