【问题标题】:Why does Groovy replace java.lang.String.length() with size()?为什么 Groovy 将 java.lang.String.length() 替换为 size()?
【发布时间】:2015-10-04 16:56:02
【问题描述】:

关于 Groovy 编程语言的维基百科 current article 解释说“大多数有效的 Java 文件也是有效的 Groovy 文件”,并给出了以下示例,首先是 Java 代码:

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

那么在 Groovy 中也是如此:

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

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

java.lang.String 没有名为size() 的方法。 Groovy 不会为自己的目的继承 String

String s = ""
Class c = s.getClass()
println c.getName() // "java.lang.String"

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

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

但这段代码仍然可以正常工作:

// [...]
println s.size() // "0"

我找不到任何 Groovy 文档来解释这一点。

  • size() 来自哪里?
  • 为什么它没有出现在对象上?
  • 为什么要添加它?
  • length() 有什么问题,为什么不是首选?
  • java.lang.String 中添加了哪些其他额外方法?
  • 其他标准类呢?

【问题讨论】:

  • 快速猜测一下:Groovy 可能正在使用它自己的 metaprogramming 来实现这样的魔法。
  • this 显然是它的来源。 Here你可以看看还有哪些其他的类/方法。
  • "length() 出了什么问题?" - 我一直觉得 length() 不是真正一致的(更不用说 Array.length!),而集合 API 使用 size()
  • 而且它没有 "replace" 长度与大小(正如问题中提到的那样),它添加了一个新的 size 方法,length 仍然是那里
  • 我假设 length() 已被替换,因为有两种方法做完全相同的事情是没有意义的。

标签: java string groovy jvm-languages


【解决方案1】:

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

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

要查看 Groovy 添加的一些方法,请查看 GDK,尤其是 CharSequenceCollection

【讨论】:

    【解决方案2】:

    我建议你阅读 Groovy 类的文档 StringGroovyMethods,它对如何使用 Groovy 进行了简单的解释。

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

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 2014-11-18
      • 2015-11-01
      • 2015-03-18
      • 1970-01-01
      • 2016-11-27
      • 2022-08-03
      • 2015-07-01
      • 1970-01-01
      相关资源
      最近更新 更多