【发布时间】:2014-09-17 04:03:15
【问题描述】:
我想知道封闭类可以创建多少个静态成员类的实例。我假设只有一个,但是下面的 Bloch 摘录对我来说没有意义。
引用 Joshua Bloch 的 Effective Java - 第 22 条*:优先考虑静态成员类而不是非静态成员类。
私有静态成员类的一个常见用途是表示由其封闭类表示的对象的组件。例如,考虑一个 Map 实例,它将键与值相关联。许多 Map 实现对于 map 中的每个键值对都有一个内部 Entry 对象。虽然每个条目都与映射相关联,但条目上的方法(getKey、getValue 和 setValue)不需要访问映射。因此,使用非静态成员类来表示条目是很浪费的:私有静态成员类是最好的。如果不小心在入口声明中省略了 static 修饰符,地图仍然可以工作,但每个入口都会包含对地图的多余引用,这会浪费空间和时间。
他说 map 为 map 中的每个键值对创建一个 Entry 对象,即静态成员类的多个实例。
所以我的假设是错误的!这意味着我对静态成员类的理解是错误的。每个人都知道静态成员变量的行为方式,例如经典的静态最终字符串——对象只有一个实例。
这是否意味着在实例化封闭对象时实际上并未实例化静态成员类?
那么在这种情况下,Map 使用静态成员类作为 Entry 的意义何在?为什么不直接在 API 上使用接口?然后,所有其他 Collections 类都可以提供自己的实现。
[*] 才发现是我的PDF版书的第18条
【问题讨论】:
-
该类只有一份副本。但是您可以创建该类的许多实例。对于非静态类,从概念上讲,外部类的每个实例都有一个该类的副本(尽管出于效率原因实际上并未以这种方式实现)。
-
我发现最容易将静态内部类视为一个普通类,其名称中包含外部类。外部类和内部类之间的唯一关系是访问修饰符。
-
Map只有一个,不管是不是静态的,但可以包含多个元素
标签: java oop nested-class static-class