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 {
}
or
public class Foo {
}
I understand that there will be some class - visibility issues with the former example (probably it won't be visible from other packages). But anyway, are there any reasons why someone may want to do as in the first code sample?
UPD: What cons I see in the former solution: nobody cares that it's non-public
. That class can be simply extended by some other public
class in the same package later, then, non-public part of the class may bring you visibility/access issues.
Here is an example. No one needs to know about existence of our ConcreteDocument.
DocumentIF.java
ConcreteDocument.java
DocumentFactory.java
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.
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.
Classes without a
public
orprotected
modifier are only visible inside the package they reside. If you think of components and interfaces there is a reason for leaving out thepublic
modifier. Let's say you have apublic
classMyCompontent
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.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.