What\'s the reason of making top-level class non-public in Java?
Let\'s say we have Foo.java
, there could be
class Foo {
}
It is considered good design to keep the visibility of a class to the most minimum required. The reasons that I can think of:
The book "Effective Java" by Josh Bloch is an excellent reference for Idiomatic Java code and design.
Here is an example. No one needs to know about existence of our ConcreteDocument.
DocumentIF.java
public interface DocumentIF {
}
ConcreteDocument.java
class ConcreteDocument implements DocumentIF {
}
DocumentFactory.java
public class DocumentFactory {
public DocumentIF createDocument() {
return new ConcreteDocument();
}
}
Classes without a public
or protected
modifier are only visible inside the package they reside. If you think of components and interfaces there is a reason for leaving out the public
modifier. Let's say you have a public
class MyCompontent
that internally uses other classes, but does not want to publish those to the outside world (users of the component) it makes sense to leave out the visibility modifier.
I understand that there will be some class - visibility issues with the former example (probably it won't be visible from other packages).
That seems to me to be reason enough to use it if you want to keep the class private to that one package.
Just noticed another use! It seems you can only have one public top-level class per code file, but any number of non-public top-level classes. Haven't verified it personally, but if true that could be quite useful to prevent cluttering your project folder and to group classes with related functionality that aren't needed outside of the package.
Typically, you make a class package-private because you don't want the class to be used outside the package. When a top-level class isn't public, it's private to the package.
Say you have a package with a number of classes that must communicate the same sort of data with one another. But this data structure is an implementation detail and so you don't want it being used by user code. Making the transfer class package private maintains this sort of package level encapsulation.