web-dev-qa-db-ja.com

GroovyがJava.lang.String.length()をsize()に置き換えるのはなぜですか?

Wikipediaの 現在の記事 は、Groovyプログラミング言語について、「最も有効な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() を使用していることに注意してください。2番目の例では、このメソッドは不可解に置き換えられていますsize()と呼ばれるメソッドを呼び出して、2番目の例が有効なGroovyコードであり、正しい動作をしていることを verified しています。

_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_に追加されましたか?
  • 他の標準クラスはどうですか?
12
qntm

Groovyは、文字列やあらゆる種類の他のクラスに多くのメソッドを追加します。すべての便利なメソッドは、Groovyが優れている理由の一部です。

_Java.lang.String_は_Java.lang.CharSequence_を実装しており、そこからすべて(ほとんど)の魔法が得られます。 size() など。 Groovyは、サイズと見なすことができるほとんどのオブジェクトにsize()メソッドを追加して、全体で一貫したメソッドを使用できるようにします。 length()はまだ完全に有効です。Groovyはこれを削除しません。

Groovyが追加するメソッドのいくつかを確認するには、 [〜#〜] gdk [〜#〜] 、特に CharSequence および Collection を確認してください。 。

14
doelleri

Groovyクラスのドキュメント StringGroovyMethods をお読みになることをお勧めします。Groovyでどのように機能するかを簡単に説明しています。

静的メソッドは、最初のパラメーターを宛先クラスとして使用します。たとえば、public static String reverse(String self)は、Stringのreverse()メソッドを提供します。

0
Thiht