Item 22: Favor static member classes over nonstatic

《优先考虑静态成员类而不是非静态成员类》。

可能由于我经验太少,这本书的题目总是要看半天。。

什么是静态成员类(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。

Item 22: Favor static member classes over nonstatic_第1张图片
什么时候用静态成员类

这看着挺晦涩的。。看不懂。意思大概是如果成员类不需要访问它enclosing class 的实例的时候就声明成static member class吧。

总结

如果一个嵌套类需要在单个方法之外仍然是可见的,或者他太长了,不适合方法内部,就应该使用成员类。
如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的;否则就做成静态的。假设这个嵌套类属于一个方法的内部,如果你需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就把他做成匿名类;否则,就做成局部类。

总之,由于缺乏实际经验,看不太懂。

你可能感兴趣的:(Item 22: Favor static member classes over nonstatic)