为什么String.length()是一个方法?

Aci*_*dic 14 java string

如果String对象是不可变的(因此显然不能改变它的长度),为什么是length()一个方法,而不是简单地public final int length存在于数组中?

它只是一个getter方法,还是进行某种计算?

试着看看这背后的逻辑.

Yis*_*hai 19

Java是一种标准,而不仅仅是一种实现.不同的供应商可以以不同的方式许可和实施Java,只要它们符合标准即可.通过对字段进行标准调用,可以非常严重地限制实现,这是没有充分理由的.

对于课程的未来而言,方法也更灵活.除了在一些非常早期的Java类中,几乎从未完成将最终常量公开为一个字段,该字段可以与类的每个实例具有不同的值,而不是作为方法.

length()方法早于 CharSequence接口,可能来自其第一个版本.看看效果如何.多年以后,没有任何向后兼容性的损失,CharSequence接口被引入并且非常适合.对于一个领域来说这是不可能的.

所以,让我们真正颠倒这个问题(当你设计一个几十年来保持不变的类时,你应该做什么):这里有什么领域,为什么不简单地把它作为一个方法?

  • 通过权衡,减少封装.它不能作为接口的一部分存在.(接口有常量,但这不是一回事),你无法改变对场的看法.无论如何,任何假设的性能优势都是过早的优化.http://en.wikiquote.org/wiki/Donald_Knuth (5认同)
  • 这是一个有趣的想法。对我来说,一个领域就是更少的代码,但具有同等或更好的性能。 (2认同)
  • @Acidic @Inerdial:即便如此,也不要这么做。如果除了一致性之外没有其他原因,请创建一个访问器方法。为什么你的库的用户必须记住某某属性是一个字段,而某某是一个方法?如果你想追溯添加一个接口(例如`CharSequence`),为什么要让用户想知道`length`和`length()`之间有什么区别?您不能将所有属性都设置为字段,但可以将它们全部设置为方法,因此只需遵循良好的 OO 规则并使用访问器方法,除非您有充分的理由不这样做。 (2认同)

ysh*_*vit 5

这是封装的基本原则。

封装的一部分是类应该对其接口隐藏其实现(在接口的“契约设计”意义上,而不是在 Java 关键字意义上)。

你想要的是字符串的长度——你不应该关心它是否被缓存、计算、委托给其他字段等等。如果 JDK 人员想要改变未来的实现,他们应该能够做到这一点,而无需你必须重新编译。