当前位置: 首页 > 面试题库 >

Bloch有效的Java-相对于非静态而言,更喜欢静态类-多少个实例?

马正初
2023-03-14
问题内容

我想知道封闭类可以创建多少个静态成员类实例。我仅假设其中一个,但随后从Bloch中摘录的内容对我来说没有意义。

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

私有静态成员类的常见用法是表示由其封闭类表示的对象的组件。例如,考虑一个Map实例,该实例将键与值相关联。许多Map实现都有一个内部Entry对象,用于映射中的每个键值对。虽然每个条目都与地图关联,但是条目上的方法(getKey,getValue和setValue)不需要访问地图。因此,使用非静态成员类表示条目将很浪费:最好使用私有静态成员类。如果您不小心在条目声明中省略了static修饰符,则地图仍然可以使用,但是每个条目都将包含对该地图的多余引用,这会浪费空间和时间。

他指出,映射为映射中的每个键值对(即静态成员类的多个实例)创建一个Entry对象。

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

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

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

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


问题答案:

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

在情况下Map,之所以选择它是因为Map.Entry它的名字清楚地指出了与之Entry相关的含义Map。正如您所建议的,为此使用一个普通的类是完全合理的。唯一的区别是你不会写东西Map.Entry

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



 类似资料:
  • 我的程序有问题。Eclipse写道: 我做错了什么?我的应用程序中有2个错误。班你能改进我的代码并解释一下吗?先谢谢你。 多边形 地聚线

  • 我在看一个项目,我发现了一些很奇怪的东西。 现在,我认为唯一的两个优点是,在非静态容器中封装时,命名更加清晰,并且可以传递的参数更少。 但我想知道这是不是一个好主意,通过设计来包装静态类与非静态?如果有的话,还有哪些其他原因?因为我认为创建一个静态并对其进行调用是可以的。但是这个项目特意将所有静态类打包;我也不知道为什么。

  • 问题内容: 直到几周前,我还以为我知道何时创建字段和方法或。例如,当一个字段(例如另一个类的对象)对于该类的任意数量的对象是唯一的时,应将其设置为。 但是几周后,我读到了有关JVM垃圾收集的信息。 我知道字段永远不会被垃圾收集,并且始终保持在内存中,除非类加载器本身是垃圾收集的。 但是,如果我不创建该字段,至少它将被垃圾回收。 因此,在使字段/方法静态化与否之间似乎有一条 很细的界限 。 有人可以

  • 这两个函数是否重载

  • 问题内容: 当我需要一堆无状态实用程序方法时,Java 8中的最佳实践是什么。有一个 不会 被任何人(即and)实现的接口是正确的吗?还是采用旧方法-具有并使用私有构造函数|| 更好?枚举? 问题答案: 接口的主要目的是提供一种类型和对该类型的操作词汇(方法)。它们之所以有用且灵活,是因为它们允许多个实现,并且实际上,它们旨在允许在类层次结构中不相关的实现。 问题问, 具有任何人都不会实现的接口是

  • 问题内容: 我知道不可能在一个类中重写一个方法。但是,有没有办法使用非静态方法作为静态方法呢?例如,我有一个加数字的方法。我希望此方法在没有对象的情况下有用。是否可以在不创建其他方法的情况下执行类似的操作? 编辑:我的意思是,如果我将一个方法设为静态,我将需要它接受参数,如果我创建了一个已经设置了变量的对象,那么再次对具有相同参数的对象调用函数将非常不舒服。 我知道代码不正确,但是我想展示自己想做