《优先考虑静态成员类而不是非静态成员类》。
可能由于我经验太少,这本书的题目总是要看半天。。
什么是静态成员类(static member classes)?
嵌套类(nested class)有四种:
- 静态成员类(static member class)
- 非静态成员类(nonstatic member class)
- 匿名类(anonymous class)
- 局部类(local class)
除了第一种之外,其他三种都称为内部类(inner class)。
嵌套类(nested class)是指被定义在另一个类的内部的类。嵌套类存在的目的应该只是为他的外围类(enclosing class)提供服务。如果嵌套类将来可能会用于其他的某个环境中,他就应该是顶层类(top-level class)。
也就是说,嵌套(nested)类 = 内部(inner)类 + 静态成员类。
其他重要的
A static member class is a static member of its enclosing class and obeys the same accessibility rules as other static members.
这句话就是说静态成员类也可以看成「外围类」(enclosing class)的一个普通成员。举个例子:
这样一个非静态成员类:
public class A {
public class B {
}
}
如果需要B的instance,不能这样:
A.B ab = new A.B();
编译器会提示:not an enclosing class
。
而要这样:
A a = new A();
A.B ab = a.new B();
或者,把member class 用static修饰。
非静态成员类最常见的用法是定义一个adapter。
这看着挺晦涩的。。看不懂。意思大概是如果成员类不需要访问它enclosing class 的实例的时候就声明成static member class吧。
总结
如果一个嵌套类需要在单个方法之外仍然是可见的,或者他太长了,不适合方法内部,就应该使用成员类。
如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的;否则就做成静态的。假设这个嵌套类属于一个方法的内部,如果你需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就把他做成匿名类;否则,就做成局部类。
总之,由于缺乏实际经验,看不太懂。