为什么Groovy用size()替换java.lang.String.length()?

qnt*_*ntm 12 java string groovy jvm-languages

Wikipedia 目前关于Groovy编程语言的文章解释说"大多数有效的Java文件也是有效的Groovy文件",并提供以下示例,首先是Java代码:

for (String it : new String[] {"Rod", "Carlos", "Chris"})
    if (it.length() <= 4)
        System.out.println(it);
Run Code Online (Sandbox Code Playgroud)

然后在Groovy中相同:

["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}
Run Code Online (Sandbox Code Playgroud)

请注意,在第一个示例中,我们使用了完全普通的Java方法java.lang.String.length().在第二个例子中,这个方法已被神秘地替换为对一个名为的方法的调用size().我已经验证第二个示例是有效的Groovy代码并且具有正确的行为.

java.lang.String没有一个叫做的方法size().Groovy没有String为自己的目的进行子类化:

String s = ""
Class c = s.getClass()
println c.getName() // "java.lang.String"
Run Code Online (Sandbox Code Playgroud)

它也不会以某种方式为String对象添加额外的方法:

// [...]
for (def method : c.getMethods()) {
    println method.getName()
}
// prints a whole bunch of method names, no "size"
Run Code Online (Sandbox Code Playgroud)

但仍然这个代码以某种方式工作:

// [...]
println s.size() // "0"
Run Code Online (Sandbox Code Playgroud)

我找不到任何Groovy文档来解释这个.

  • 哪里size()来的?
  • 为什么它没有出现在物体上?
  • 为什么要添加?
  • 出了什么问题,length()为什么不首选?
  • 还添加了哪些额外的方法java.lang.String
  • 其他标准课怎么样?

doe*_*eri 14

Groovy为字符串和各种其他类添加了许多方法.所有便捷方法都是Groovy很棒的部分原因.

java.lang.String实现java.lang.CharSequence,这就是它获得所有(大部分)魔力的地方.size(), 例如.Groovy size()为大多数对象添加了一种方法,可以将某些东西视为一个大小,以便您可以全面使用一致的方法.length()仍然完全有效,Groovy不会删除它.

要查看Groovy添加的一些方法,请查看GDK,特别是CharSequenceCollection.


Thi*_*iht 0

我建议您阅读 Groovy 类的文档StringGroovyMethods,它简单地解释了 Groovy 的工作原理。

使用静态方法时,第一个参数是目标类,例如。public static Stringreverse(String self) 为String提供reverse()方法。