![](/img/trans.png)
[英]Why is a `.class` files still created for each non-public top-level class by javac?
[英]Non-public top level class in Java
在Java中创建顶级类非公共的原因是什么?
假设我们有Foo.java
,可能会有
class Foo {
}
要么
public class Foo {
}
我知道前一个例子会有一些类 - 可见性问题(可能从其他包中看不到)。 但无论如何,有没有任何理由可以解释为什么某人可能会像第一个代码示例中那样做?
UPD:我在前一个解决方案中看到了什么缺点:没有人关心它non-public
。 稍后可以通过同一个包中的其他public
类简单地扩展该类,然后,该类的非公共部分可能会为您带来可见性/访问问题。
这是一个例子。 没有人需要知道我们的ConcreteDocument的存在。
DocumentIF.java
public interface DocumentIF {
}
ConcreteDocument.java
class ConcreteDocument implements DocumentIF {
}
DocumentFactory.java
public class DocumentFactory {
public DocumentIF createDocument() {
return new ConcreteDocument();
}
}
我知道前一个例子会有一些类 - 可见性问题(可能从其他包中看不到)。
在我看来,如果你想让这个类专用于那个包,那么我就有足够的理由使用它。
刚注意到另一种用途! 看起来每个代码文件只能有一个公共顶级类,但是任何数量的非公共顶级类。 尚未亲自验证,但如果是真的,那么可以非常有用,可以防止项目文件夹混乱,并将具有相关功能的类分组到包外。
通常,您将类包设为私有,因为您不希望在包外使用该类。 当顶级类不公开时,它对包是私有的。
假设您有一个包含许多类的包,这些类必须相互传递相同类型的数据。 但是这个数据结构是一个实现细节,因此您不希望它被用户代码使用。 使传输类包私有保持这种包级别封装。
没有public
或protected
修饰符的类只能在它们所在的包中可见。 如果您考虑组件和接口 ,则有理由省略public
修饰符。 假设您有一个public
类MyCompontent
,它在内部使用其他类,但不想将它们发布到外部世界(组件的用户),而忽略可见性修饰符是有意义的。
将类的可见性保持在最低要求是一种良好的设计。 我能想到的原因:
Josh Bloch的“Effective Java”一书是Idiomatic Java代码和设计的绝佳参考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.