我看到一些遗留代码在某些对象上使用length
属性,而其他对象使用length()
方法。目前,我正在使用NodeList
包中的org.w3c.dom
,我发现它使用getLength()
方法来获取元素数量。
我的问题是,作为Java开发人员,我如何知道如何确定何时使用length
,length()
,size()
,getLength()
?显然它取决于对象类型,而API是有读取的......但关键是Java Development如何选择在其类中实现哪些。
注意:在问题When to use .length vs .length()中,Makoto回答表明.length
是数组上的属性。这不是方法调用,length()
是对String的方法调用。但是,原因何在?为什么不使用任何方法或永远的属性来维护所有API的一致性。
答案 0 :(得分:8)
Java开发人员如何选择在其类中实现哪些[方法]?
当您实现包含其他对象的类时,它几乎总是size()
,即Collection
接口提供的方法。
就其他选择而言,你应该避免暴露成员变量,即使是最终变量,因为它们不能通过接口访问。由于一些JVM技巧,Java因数组而无法使用它,但是你无法做到这一点。因此,length
应该出来了:它仍然保留在Java中,因为从第一天起它就不可能改变语言中那些基本的东西,但它绝对不是人们应该考虑的东西在设计新课程时。
当您实现自己的具有长度的类型(例如,矩形或线段)时,由于Java Bean的命名约定,您应该更喜欢getLength()
到length()
。
答案 1 :(得分:5)
显然它取决于对象类型,并且API用于读取...
您已经自己回答了问题:查看您正在使用的任何课程的API文档。
但关键是Java Development如何选择在其类中实现哪些。
Java标准库中的类是由不同的人在很长一段时间内开发的,这些类并不总是对方法名称做出相同的选择,因此存在不一致性,不幸的是,我只需忍受那个。
答案 2 :(得分:2)
没有明确的规则,否则我们不会在jdk本身看到这样的混淆。但在做出这样的设计决定时,需要考虑以下事项。
不用担心。这是一件小事,并没有做出太大的改变。所以当你想到这个时间超过5分钟时,你可能已经在浪费钱了。
在框架需要时使用getter。许多框架都依赖于getter风格。如果您需要或希望此类框架能够与您的课程很好地协作,那么使用该样式可能会有所帮助。
越短越好。 '得到'部分并没有增加清晰度。它只是为源代码生成噪声字符,因此如果您因某些原因不需要它,请不要使用它。
方法更容易发展。长度通常是不直接设置但以某种方式计算的数量。如果您隐藏在方法后面,它可以让您灵活地在以后更改该实现,而无需更改API。
直接现场访问速度应该快一点,但如果您不是在进行大量在线交易或其他事情,那么差异甚至不值得考虑。如果你这样做,你应该在做出决定之前做自己的测量。无论如何,热点编译器几乎肯定会内联方法调用。
所以,如果没有任何外力推动你朝着不同的方向前进,我会选择长度()'
答案 3 :(得分:0)
根据OOPS原则,length应该是属性,getLength()应该是方法。还应该通过方法公开length属性,因此getLength()听起来更合适。
不幸的是,并非所有Java库类都遵循标准。有一些例外,这是其中之一。
答案 4 :(得分:-3)
在纯OO语言中,它应该总是像length()
这样的方法。因此,在类层次结构中,您可以覆盖属性长度。
但Java不是纯粹的OO。字段(.length)与方法(length())的主要原因是性能问题。
甚至Sun / Oracle程序员也做了一些糟糕的课程设计。