由于大多数其他类似乎让开发人员通过调用方法来检索其内容的长度或大小,通常是length()
or size()
,如何通过读取实例变量来检索数组的长度length
?这对我来说似乎不一致,特别是因为 String 对象也是不可变的并且仍然使用length()
方法。
5 回答
这是不一致的。我想这种区别的真正原因只能在 Java 语言发展的早期历史中找到。也许是因为当时似乎是性能原因。我怀疑如果今天从头开始(重新)设计 Java,那么该length
字段将会消失,取而代之的是一个java.lang.Array
类*(类似于java.lang.Enum
),所有数组都将从该类派生,并且包含一个length()
由所有数组继承的方法。
实际上,缺少Array
类(在上述意义上)可能表明为什么会有一个length
属性:数组比集合类(类库的一部分)更“内置”到语言中。
* Java 确实有java.lang.reflect.Array
,但这与我所说的完全不同。
大多数集合都有动态大小,因此他们需要一种方法来验证特定时间的长度/大小。数组具有固定长度,因此不需要一直重新计算。
数组的大小是固定的——它永远不会改变。因此,您不需要方法的开销。
原因是JLS这么说的:
数组类型的成员全部如下:
- 公共 final 字段
length
,其中包含数组的组件数。长度可以是正数或零。
关于潜在动机:只有创造语言的人才能回答......
有趣的是,作为 Java 起源的语言 Oak已经有了这个概念。如果你阅读它的规范,你会看到:
任何数组的长度都可以通过使用
.length
所以这里最好的猜测是,这是 20 多年前几个人做出的决定的结果。
每次调用方法时都会执行该方法。存在优化,例如缓存等。但关键是数组永远不会改变它的大小。
因此,有什么比“最终”(不确定引擎盖下的实现但相同的概念)实例的字段更适合这种情况的呢?
java.util.Collection
描述了一些包装数组的类ArrayList
,如HashSet
等。在他们的例子中,大小被改变,因为集合的概念是有一个可扩展的数组。因此,大小必须通过方法 ( size()
) 来计算,在这种情况下不是字段。