在Java中,什么情况下会将length作为方法使用,什么情况下会将其作为属性使用?

13
我看到一些遗留代码使用某些对象的 length 属性,而其他代码则使用 length() 方法。目前我正在使用来自 org.w3c.dom 包的 NodeList 并发现它有一个 getLength() 方法来获取元素数量。
我的问题是,作为Java开发人员,我该如何确定何时使用 lengthlength()size()getLength()?显然这取决于对象类型和API可读性...但关键是Java开发人员如何选择在其类中实现哪个选项。
注意:在问题"When to use .length vs .length()"中,Makoto的答案表明.length是数组上的属性。这不是一个方法调用,而length()是String上的方法调用。但是,原因是什么?为什么不对所有API始终使用方法或属性以保持一致性。

嘿,Java API 有些过时的东西已经存在了将近20年了,你知道吗...无论如何,现在的惯例主要是使用 getters,所以你会更经常地看到.getLength()。好吧,一个Collection.size()... - fge
5
Java没有属性。length是一个字段。对于数组,您使用length,对于列表,您使用size()。会有很多类具有各种名称的字段和方法,因此这很难回答,但如果在对象后按.,您的IDE应该会出现一个列表,其中包含您可以对其执行的所有操作。 - Paul Boddington
你别无选择,只能查找每个你想使用的类型的文档。 - 5gon12eder
5个回答

8
当Java开发者实现包含其他对象的类时,他们会选择实现哪些方法呢?几乎总是会选择由Collection接口提供的方法size()。至于其他选择,你应该避免暴露成员变量,即使是final的,因为它们无法通过接口访问。Java可以通过一些JVM技巧来运行数组,但你不能这样做。因此,length 应该被排除在外:它仍然存在于Java中,因为从一开始就有这种基础语言能力,但在设计新类时绝对不应考虑它。当你实现具有长度的自定义类型(例如矩形或线段)时,应优先考虑使用getLength()而非length(),因为这符合Java Beans的命名约定。

非常好的回答,加一分。我在我的回答中提到了你的回答。只是怀疑为什么Jesper的回答得到了+3,而你的没有!! - Am_I_Helpful

5
显然这取决于对象类型,API是用于读取的...... 你已经自己回答了你的问题:查看你正在使用的任何类的API文档。 但问题是Java开发人员如何选择在他们的类中实现哪些内容。 Java标准库中的类是由不同的人在很长一段时间内开发的,他们并不总是为方法名称做出相同的选择,因此存在不一致性,不幸的是你只能接受这一点。

在我看来,这个理由相当无用。可以看一下dasblinkenlight或我的回答。我怀疑这为什么会被投票赞了三次! - Am_I_Helpful
@shekharsuman 我认为我对问题的解释与你不同。我认为问题是:“为什么设计标准库的人会选择如此不一致的名称?”,而你可能认为问题是:“当我设计一个类时,应该选择什么名称?” - Jesper
现在,我自己对此感到困惑!可能是因为我的看法是第二个,也就是你提到的那个!但是,我猜测 OP 的意图与我的相同! - Am_I_Helpful

2
没有明确的规则,否则我们在 jdk 中就不会看到这样的混乱。但是,在做出这样的设计决策时,有些事情需要考虑。
  1. 不要太担心。这只是一个小问题,不会产生太大的影响。所以,如果你花费超过5分钟考虑这个问题,你可能已经浪费了时间。

  2. 当框架需要时,请使用 getter。许多框架依赖于 getter 样式。如果你需要或希望这些框架与你的类协作良好,使用这种样式可能会更有益。

  3. 越短越好。“get”不会增加清晰度。它只会在源代码中生成两个噪声字符,所以如果你没有某种原因需要它,就不要使用它。

  4. 方法更容易发展。长度通常是一种不直接设置而是以某种方式计算的数量。如果你把这个隐藏在一个方法后面,它会给你提供灵活性,以后可以改变实现方式,而不必改变 API。

  5. 直接字段访问应该会快一点,但如果你不是在高交易量的在线交易等领域工作,差异甚至不值得考虑。而且,如果你确实需要,应该在做出决策之前进行自己的测量。热点编译器几乎肯定会内联方法调用。

所以,如果没有任何外部驱动力推动你朝不同的方向发展,我会选择“length()”。


0
根据面向对象编程原则,长度应该是属性,而getLength()应该是方法。此外,长度属性应该被封装,并通过方法暴露,因此getLength()更为合适。
不幸的是,并非所有Java库类都遵循标准。其中有一些例外情况,这就是其中之一。

-3
在一个纯面向对象的语言中,它应该始终像 length() 这样的方法。因此,在类层次结构中,您可以重写属性长度。
但是 Java 不是纯面向对象的。而字段(.length)与方法(length())之间的主要区别是/曾经是性能问题。
即使 Sun/Oracle 的程序员也会做出一些糟糕的类设计。

1
Java所做的方法和字段之间的强区分与面向对象无关。在面向对象中,也没有什么可以指定您应该首选getX还是只是X。 - Jens Schauder
这与Java创始人如何理解或解释面向对象有关。他们说Java是一种面向对象语言。背景太广泛,不适合作为编程问题讨论。 - PeterMmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接