当前位置: 首页 > 面试题库 >

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

范麒
2023-03-14
问题内容

如果String对象是不可变的(因此显然不能改变其长度),为什么要length()使用方法而不是简单地public final int length像数组中那样呢?

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

只是想看看背后的逻辑。


问题答案:

Java是一种标准,而不仅仅是一种实现。只要遵守标准,不同的供应商就可以以不同的方式许可和实现Java。通过对字段进行标准调用,这毫无理由地严重限制了实现。

而且,就类的未来而言,方法要灵活得多。除了在某些非常早期的Java类中,几乎永远不会将final常量公开为一个字段,该字段在类的每个实例中可以具有不同的值,而不是方法。

length()方法早于
CharSequence接口,可能早于其第一个版本。看看效果如何。数年后,在不损失任何向后兼容性的情况下,引入了CharSequence接口并很好地配合了该接口。对于字段,这是不可能的。

因此,让我们真正地反驳这个问题(当设计一个旨在保持数十年不变的类时,应该做的事情):字段在这里有什么好处,为什么不简单地将其设为方法?



 类似资料:
  • 让这种方法本土化背后的逻辑是什么? 与仅使用哈希图制作内嵌字符串池相比,有什么优势? 它看起来有点奇怪,但在非本机代码中似乎很容易做到: 那么为什么是本机代码呢?

  • 根据我的理解,如果子例程不作用于类的实例(其作用仅限于显式输入/输出),则它是;如果子例程作用于类的实例,则它是(它可能会对实例产生副作用,使其不纯)。 关于这个话题,这里有一个很好的讨论。请注意,根据接受答案的定义,静态实际上应该是一个函数,因为实例从不隐式传递,而且它不能访问任何实例的成员。 不过,考虑到这一点,静态实际上不应该是函数吗? 我想确保我使用了正确的措辞。 有人能澄清一下吗?

  • 学习Java8默认方法。这个链接就像互联网上的其他资源一样说 在“最严格的意义上”,默认方法是一种倒退,因为它们允许你用代码“污染”你的接口。但它们提供了允许向后兼容的最优雅和最实用的方法。它使Oracle更容易更新所有集合类,也使您更容易为Lambda修改现有代码。 我的理解是Java8Dev/Designers在接口中提供了默认方法,这样所有实现类就不必不必要地重写相同的行为,从而提供了向后兼

  • 问题内容: 我很好奇,为什么是方法的公开? 此方法从调用它的位置替换原始堆栈跟踪,从而删除了定位异常所需的信息。它可以用于混淆,但无需付出太多努力,因为新的堆栈跟踪将直接指向混淆代码。更好的方法是简单地隐藏异常或抛出新异常。 但是我找不到在现存的上调用此方法的 合理 理由。所以问题是:为什么这种方法是公开的?后面有什么意义吗? 问题答案: 原因之一是性能。抛出和捕获异常很便宜;昂贵的部分是填充堆栈

  • 在.NET Framework 4.5中,由Trim()方法调用的专用TrimHelper()方法使用以下条件来确定是否需要修剪字符:(由.NET Reflector反编译的代码) 我想知道为什么IsBOMWhitesspace方法总是返回false?? 这是微软计划在未来改变/扩展的吗?例如,通过检查char是否为‘u efff’并在这种情况下返回true?