I know that an inner class has access to everything in the outer class (because it's a member of that class) but what about the other way around?
Does the outer class have access to private variables and methods within an inner class?
I've seen articles mentioning that inner classes should be private so that they are accessible only to the outer class. What does that do to the accessibility of that inner class?
What is best practices in dealing with access levels when it comes to your inner classes? I'm assuming more encapsulation the better but does that come at the expense of accessibility?
This topic is covered in some detail by Effective Java (2nd edition) Item 22: "Favor static member classes over nonstatic".
A brief summary:
- An inner class should not have access to an outer class instance, unless that access is required, i.e. inner classes should be
static
by default. To get technical, Effective Java calls these static member classes, as opposed to inner classes, and uses the term nested class to encompass both the static and nonstatic versions.
- An outer class always has access to the members of its inner classes, even when those members are
private
. In this way, an inner class can expose itself only to its outer class.
- "An inner class should exist only to serve its outer class."
Personally, I'm inclined to implement an inner class whenever doing so allows the inner class's constructors to be private
, i.e. when a class can only be instantiated from one other (outer) class. Any additional encapsulation, such as making the entire inner class private
, is desirable; but public
inner classes are perfectly acceptable. There are many examples in Java, such as AbstractMap.SimpleEntry
.