为什么支持静态成员类而不是非静态成员(Joshua Bloch Item#22)?

时间:2017-05-16 10:06:41

标签: java design-patterns

在阅读了本书的那一部分后,我仍然不明白为什么这么广泛地说明了。 非静态成员类是该语言的一部分。同意并非所有编程语言的所有部分都是完美的。通过访问封闭实例的方法来实现非静态成员类的优点,因此很少超过可能增加的代码复杂性(内部类和外部类之间更紧密的耦合.BTW:静态成员也可以访问外部类的字段类,只要外类也是静态的)?本书的这一部分没有给出任何缺点。

适配器模式的非静态成员类怎么样?生成器模式?

对于微小对象(类似于C ++的结构)的非静态成员类,如何保留属于一起的一些数据并且属于外部类(因此没有理由使它们成为静态)呢?

(Joshua Bloch在 Effective Java 2nd Edition 中的这个项目似乎有一个很大的摘录:http://jtechies.blogspot.com/2012/07/item-22-favor-static-member-classes.html - 以防万一有人没有这本书的方便,要知道我的出发点是什么)。

1 个答案:

答案 0 :(得分:1)

本书第22项明确阐述了您的疑虑。

  

为什么支持静态成员类而非非静态(Joshua Bloch Item#22)?

答案:

  

如果声明一个不需要访问封闭的成员类   实例,总是将静态修饰符放在其声明中,使其成为静态而非非静态成员类。如果省略此修饰符,则每个实例将对其封闭实例具有无关的引用。存储此引用会花费时间和空间,并且可能导致封闭实例被保留,否则它将有资格进行垃圾回收(第6项)。如果您需要在没有封闭实例的情况下分配实例,您将无法这样做,因为非静态成员类实例需要具有封闭实例。

  

适配器模式的非静态成员类怎么样?生成器模式?

答案:

  

非静态成员类的一个常见用途是定义适配器 [Gamma95,p。允许将外部类的实例视为某个不相关类的实例。例如,Map接口的实现通常使用非静态成员类来实现其集合视图,这些视图由Map的{​​{1}} keySet返回,{{1 }和entrySet方法。类似地,集合接口的实现(例如valuesSet)通常使用非静态成员类来实现它们的迭代器:

List