编程语言
首页 > 编程语言> > Bloch有效的Java-与非静态相比,更喜欢静态类-多少个实例?

Bloch有效的Java-与非静态相比,更喜欢静态类-多少个实例?

作者:互联网

我想知道封闭类可以创建多少个静态成员类实例.我只假设一个,但是从Bloch提取的以下内容对我来说没有意义.

引用约书亚·布洛赫(Joshua Bloch)的《有效Java》-项目22 *:偏爱静态成员类而非非静态成员类.

A common use of private static member classes is to represent components of the object represented by their enclosing class. For example, consider a Map instance, which associates keys with values. Many Map implementations have an internal Entry object for each key-value pair in the map. While each entry is associated with a map, the methods on an entry (getKey, getValue and setValue) do not need access to the map. Therefore, it would be wasteful to use a nonstatic member class to represent entries: a private static member class is best. If you accidentally omit the static modifier in the entry declaration, the map will still work, but each entry will contain a superfluous reference to the map, which wastes space and time.

他指出,地图会为地图中的每个键值对创建一个Entry对象,即,静态成员类的多个实例.

所以我的假设是错误的!这意味着我对静态成员类的理解是错误的.每个人都知道静态成员变量的行为,例如经典的静态最终字符串-对象只有一个实例.

这是否意味着在封闭对象被实例化时,静态成员类实际上并未被实例化?

那么,在这种情况下,使用静态成员类进行Entry的Map有什么意义呢?为什么不只在API上使用接口?然后,每个其他Collections类都可以提供自己的实现.

[*]刚意识到这是我拥有的PDF版本中的第18项

解决方法:

我认为Java团队搞砸了这一名称.静态内部类(严格来说,它们的正确名称是“静态嵌套类”)与普通类没有什么不同,除了它具有漂亮的名称(Something.MyClass而不是MyClass)并且可以设为私有(即,不能从实例化)其他课程).

在使用Map的情况下,仅选择它是因为名称Map.Entry清楚表明Entry与Map有关.正如您所建议的,为此使用一个普通的类是完全合理的.唯一的区别是您不必编写Map.Entry.

我认为他们应该做的是为静态嵌套类使用“非静态”内部类(即封闭类中的类)的语法,而是发明一个新的关键字来创建“非静态”内部类,因为这些行为与普通课程有所不同.也许有点像附班. AFAIK选择关键字static是为了避免保留关键字过多,但我认为这只会引起混淆.

标签:nested-class,static-class,java,oop
来源: https://codeday.me/bug/20191010/1887354.html