【问题标题】:What is the motivation of retrieving the length of an array using a public instance variable, instead of calling a method? [duplicate]使用公共实例变量而不是调用方法来检索数组长度的动机是什么? [复制]
【发布时间】:2013-05-23 19:02:23
【问题描述】:

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

【问题讨论】:

  • 我赞成这个问题,因为这是一个很好的问题。但是,我也认为这不是一个“实用的、可回答的问题”(根据FAQ),所以我可能会投票关闭它。我觉得太虚伪了。 :(
  • 就是这样,因为这是他们设计的方式。除非您可以让 Jim Gosling 或 Ken Arnold 在这里回答,否则您将得到的只是猜测。没有建设性。

标签: java arrays language-design


【解决方案1】:

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

实际上,缺少Array 类(在上述意义上)可能表明为什么存在length 属性:数组比集合类更“内置”于语言中(它们是类库)。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 实际上,集合类不会一直重新计算。 size() 方法只是返回存储在私有字段中的值,该字段在修改集合时维护。可以对数组使用相同的方法。此外,String 对象没有动态大小(甚至可以被认为是字符数组),但它们有一个 length() 方法而不是(最终)length 字段。
    【解决方案3】:

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

    【讨论】:

    • 那为什么同样不可变的String会有length()方法呢?
    • @JimmyC String 实现了CharSequence 接口,具有length() 方法。
    • 我同意,这并不能解释为什么它与 Java 中的其他一切都不同。
    • @DanielPereira - CharSequence 是 Java 的后一个补充。从一开始,String 可能有一个 length 属性,但它没有。
    • 这么常用的方法肯定会被内联
    【解决方案4】:

    原因是JLS是这么说的:

    数组类型的成员都有以下几种:

    • 公共最终字段length,其中包含数组的组件数。长度可以是正数或零。

    关于潜在动机:只有创造该语言的人才能回答......

    有趣的是,Oak, which is the language at the origin of Java,已经有了这个概念。如果您阅读其规范,您会看到:

    使用.length可以找到任意数组的长度

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

    【讨论】:

      【解决方案5】:

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

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

      java.util.Collection 描述了一些包装数组的类,如ArrayListHashSet 等。 在他们的例子中,大小被改变了,因为集合的概念是有一个可扩展的数组。 因此,必须通过方法 (size()) 来计算大小,在这种情况下不是字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 2010-12-24
        • 2016-03-27
        • 2016-02-16
        • 2010-09-21
        相关资源
        最近更新 更多