Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Inner Class Access and Best Practices

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?

  1. Does the outer class have access to private variables and methods within an inner class?

  2. 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?

  3. 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?

like image 504
DanK Avatar asked Nov 07 '13 00:11

DanK


People also ask

What access modifier should an inner class have?

Modifiers. You can use the same modifiers for inner classes that you use for other members of the outer class. For example, you can use the access specifiers private , public , and protected to restrict access to inner classes, just as you use them to restrict access do to other class members.

Can inner class access?

As the inner class exists inside the outer class we must instantiate the outer class in order to instantiate the inner class. Hence, to access the inner class, first create an object of the outer class after that create an object of the inner class.

How do I access an inner class?

They are accessed using the enclosing class name. To instantiate an inner class, you must first instantiate the outer class. Then, create the inner object within the outer object with this syntax: OuterClass.

What are the rules for inner class?

Rules of Local Inner Class:The scope of the local inner class is restricted to the block they are defined in. A local inner class cannot be instantiated from outside the block where it is created in. Till JDK 7, the Local inner class can access only the final local variable of the enclosing block.


1 Answers

This topic is covered in some detail by Effective Java (2nd edition) Item 22: "Favor static member classes over nonstatic".

A brief summary:

  1. 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.
  2. 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.
  3. "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.

like image 138
jaco0646 Avatar answered Sep 24 '22 10:09

jaco0646