Java 使用公共实例变量而不是调用方法来检索数组长度的动机是什么?

Java 使用公共实例变量而不是调用方法来检索数组长度的动机是什么?,java,arrays,language-design,Java,Arrays,Language Design,由于大多数其他类似乎允许开发人员通过调用一个方法(通常是length()或size())来检索其内容的长度或大小,那么如何通过读取实例变量length来检索数组的长度呢?我觉得这似乎不一致,特别是因为字符串对象也是不可变的,并且仍然使用length()方法。数组的大小是固定的,它永远不会改变。因此,您不需要方法的开销。大多数集合都具有动态大小,因此它们需要一种方法来验证特定时间内的长度/大小。数组有固定的长度,因此不需要一直重新计算。每次调用一个方法时都会执行该方法。 存在优化,如缓存等。。但关

由于大多数其他类似乎允许开发人员通过调用一个方法(通常是
length()
size()
)来检索其内容的长度或大小,那么如何通过读取实例变量
length
来检索数组的长度呢?我觉得这似乎不一致,特别是因为字符串对象也是不可变的,并且仍然使用
length()
方法。

数组的大小是固定的,它永远不会改变。因此,您不需要方法的开销。

大多数集合都具有动态大小,因此它们需要一种方法来验证特定时间内的长度/大小。数组有固定的长度,因此不需要一直重新计算。

每次调用一个方法时都会执行该方法。 存在优化,如缓存等。。但关键是数组的大小永远不会改变

因此,有什么比“final”(不确定引擎盖下的实现,但概念相同)实例的字段更适合这种情况

java.util.Collection
描述了一些包装数组的类,如
ArrayList
HashSet
等。。 在他们的例子中,由于集合的概念是拥有一个可扩展的数组,所以大小会改变。
因此,必须使用方法(
size()
)计算大小,而不是本例中的字段

原因是该公司这么说:

数组类型的成员包括以下所有成员:

  • 公共最终字段
    长度
    ,其中包含数组的组件数。长度可以是正或零
关于潜在动机:只有创造语言的人才能回答

有趣的是,他已经有了这个想法。如果您阅读其规范,您将看到:

可以使用
.length


因此,这里最好的猜测是,这是20多年前几个人做出的一个决定的结果。

这是不一致的。我想这种区别的真正原因只能在Java语言开发的早期历史中找到。也许是因为当时的表现原因。我怀疑,如果Java现在从头开始(重新)设计,
length
字段将消失,取而代之的是一个
Java.lang.Array
类*(类似于
Java.lang.Enum
),所有数组都将从该类派生,并包含一个由所有数组继承的
length()
方法

实际上,缺少
数组
类(在上述意义上)可能表明了为什么存在
长度
属性:数组比集合类(类库的一部分)更“内置”于语言中


*Java确实有
Java.lang.reflect.Array
,但这与我所说的完全不同。

那么为什么同样不可变的字符串有
length()
方法?@JimmyC
String
实现了
CharSequence
接口,它有
length()
方法。我同意,这并不能解释为什么它与Java中的其他东西不同。@DanielPereira-
CharSequence
是Java的后一个补充。从一开始,
String
就可以有一个
length
属性,但它没有。这样一个常用的方法肯定会在这个问题上使用,因为这是一个很好的问题。然而,我也认为这不是一个“实际的、可回答的问题”(根据),所以我可能会投票结束它。我觉得自己很虚伪(这是因为这是他们设计的方式。除非你能让Jim Gosling或Ken Arnold在这里回答,否则你得到的只是猜测。不是建设性的。实际上,集合类不会一直重新计算。
size()
方法只返回存储在私有字段中的值,该字段在修改集合时进行维护。数组也可以使用相同的方法。此外,
String
对象没有动态大小(甚至可以被认为是字符数组),但它们有一个
length()
方法,而不是(最终)
长度
字段。