Misunderstanding of static member class:
For the most programmers, comparing to SMC, we are more than familiar with static field. So we could analogously guess how SMC works according to static field ' s feature. That leads to a MISUNDERSTANDING.--SMC is only having one instance.
Prove misunderstanding is wrong:
We may see how stupid this is and after you think this. If It means client can ' t create an instance of a static class. The only-to-do constructor ' private ' or ' package default ', and don ' t provide any public method which has the Function of ' Create a instance '.
So the thing are if we use ' Static ' to modify a inner class, it doesn ' t has any matter with whether client can create Mul TI instances.
Application of SMC
1. SMC can work independently, you can move a SMC out of its enclosing Class. It works well.
e.g. here we try to do plus operation use Calculator:
If we move SMC out of enclosing Class:
public enum Outeroperator {Plus,minus}
public class Calculator {static enum Operation{plus,minus} public int operate (int A, int. b,operation o) {switch (o) {case PL Us:return a+b;case minus:return a-b;default://use 0 as default value,this might be inappropriate, just ignorereturn 0;}} public int operate (int A, int. b,outeroperator o) {switch (o) {case Plus:return a+b;case minus:return a-b;default://use 0 as D Efault Value,this might be inappropriate, just ignorereturn 0;}} public static void Main (string[] args) {Calculator cal=new Calculator (); int Result=cal.operate (3, 1, Calculator.Operation.PLUS); System.out.println ("Calculator Operation:" +calculator.operation.plus+ "Result:" +result); int Result2=cal.operate (3 , 1, Outeroperator.plus); System.out.println ("Outeroperator Operation:" +outeroperator.plus+ "Result:" +RESULT2);}}
Result
Calculator Operation:plus Result:4
Outeroperator Operation:plus Result:4
So it works well, so why bother to make class operation a static member class. The answer is we can easily tell
Operation is a component of Calculator. So-is it, SMC was often used as an component of enclosing class.
Another example is Node in HashMap (jdk1.8).
Differences between static member Class (SMC) and nonstatic member class (NSC)
SMC doesn ' t need an instance of the enclosing class to Bind,while NSC does.
Smc
public class Outclass {public static class innerclass{public innerclass () { System.out.println (" Innerclass "); } } public static void Main (string[] args) { //outclass a = new Outclass (); Innerclass B = new Innerclass (); Innerclass C = new Innerclass (); } }
NSC
public class Outclass {public class innerclass{public innerclass () { System.out.println ("Innerclass" ); } } public static void Main (string[] args) { outclass a = new Outclass (); Innerclass B = a.new innerclass (); Innerclass C = a.new innerclass (); } }
So comparing to SMC, NMC may spend one more reference to refer to its enclosing instance. It waste space and time. But for using SMC, Innerclass need to meet the condition--innerclass ' s methods don ' t need enclosing instance ' s reference . Like methods in Entry (Getkey,getvalue,setvalue) don ' t need to refer to Map.
Reading effictive Java:static member Class (SMC) and nonstatic member class (NSC)