在Java中创建顶级类非公共的原因是什么?
假设我们有Foo.java
,可能有
class Foo {
}
或
public class Foo {
}
我理解前一个示例会出现一些类 - 可见性问题(可能从其他包中看不到)。但无论如何,有没有人会像第一个代码样本那样想要做什么?
UPD:我在前一个解决方案中看到了什么缺点:没有人关心它是non-public
。该类可以稍后通过同一个包中的其他public
类进行扩展,然后,该类的非公共部分可能会为您带来可见性/访问问题。
答案 0 :(得分:17)
这是一个例子。 没有人需要知道我们的ConcreteDocument的存在。
DocumentIF.java
public interface DocumentIF {
}
ConcreteDocument.java
class ConcreteDocument implements DocumentIF {
}
DocumentFactory.java
public class DocumentFactory {
public DocumentIF createDocument() {
return new ConcreteDocument();
}
}
答案 1 :(得分:4)
我理解前一个示例会出现一些类 - 可见性问题(可能从其他包中看不到)。
在我看来,如果你想让这个类专属于那个包,我就有足够的理由使用它。
刚注意到另一种用途!看起来每个代码文件只能有一个公共顶级类,但是任何数量的非公共顶级类。尚未亲自验证,但如果是真的,那么可以非常有用,可以防止项目文件夹混乱,并将类包含在包外不需要的相关功能。
答案 2 :(得分:4)
通常,您将类包设为私有,因为您不希望在包外使用该类。当顶级类不公开时,它对包是私有的。
假设您有一个包含许多类的包,这些类必须相互传递相同类型的数据。但是这个数据结构是一个实现细节,因此您不希望它被用户代码使用。使传输类包私有保持这种包级别封装。
答案 3 :(得分:1)
没有public
或protected
修饰符的类只能在它们所在的包中可见。如果您考虑 components 和 interfaces ,则有理由遗漏public
修饰符。假设您有一个public
类MyCompontent
,它在内部使用其他类,但不希望将这些类发布到外部世界(组件的用户),而忽略可见性修饰符是有意义的。 / p>
答案 4 :(得分:1)
将类的可见性保持在最低要求是一种良好的设计。我能想到的原因是:
Josh Bloch撰写的“Effective Java”一书是Idiomatic Java代码和设计的绝佳参考。