読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Groovyソースコード斜め読み(その3)「GDKのメソッドはDGM、DGSMに定義されている」

このシリーズの一覧はこちら

はじめに

というクラスをご存知でしょうか。実はGDKによって拡張されたメソッドの実態はこのクラスで定義されています。頭文字を取ってDGMDGSMと呼ばれたりするらしいです*1。名前からも察しが付くと思いますが、DefaultGroovyMethodsの方でインスタンスメソッドが、DefaultGroovyStaticMethodsの方でstaticメソッドが定義されています。

例. String#padLeft

では、分かりやすい例としてString#padLeftを取り上げてみましょう。
String#padLeftは

public String padLeft(Number numberOfChars, String padding)

と、GDKでは定義されています。(使用例はこちらを参照)
そして、このメソッドは以下のようなJavaコードで実装されています。

DefaultGroovyMethods.java
    /**
     * Pad a String to a minimum length specified by <tt>numberOfChars</tt>, adding the supplied padding String as many times as needed to the left.
     *
     * If the String is already the same size or bigger than the target <tt>numberOfChars</tt>, then the original String is returned. An example:
     * <pre>
     * println 'Numbers:'
     * [1, 10, 100, 1000].each{ println it.toString().padLeft(5, '*') }
     * [2, 20, 200, 2000].each{ println it.toString().padLeft(5, '*_') }
     * </pre>
     * will produce output like:
     * <pre>
     * Numbers:
     * ****1
     * ***10
     * **100
     * *1000
     * *_*_2
     * *_*20
     * *_200
     * *2000
     * </pre>
     *
     * @param self          a String object
     * @param numberOfChars the total minimum number of characters of the resulting string
     * @param padding       the characters used for padding
     * @return the String padded to the left
     * @since 1.0
     */
    public static String padLeft(String self, Number numberOfChars, String padding) {
        int numChars = numberOfChars.intValue();
        if (numChars <= self.length()) {
            return self;
        } else {
            return getPadding(padding, numChars - self.length()) + self;
        }
    }

第1引数にGroovyから使う際のレシーバとなるクラス(変数名はself)、以降の引数はGDK定義と同じとなっています。
#padLeftは文字列の左パディングを行うメソッドですので、selfのlength()を取得してゴニョゴニョするという泥臭いコードが記述されているわけですね。ちなみに、#getPaddingはprivateメソッドですので、ここでは説明を割愛させていただきます。

おわりに

ということで、あまり例をご紹介しませんでしたが、それは非常に多くのメソッドがDGMには定義されているということもあるのですが、実際に自分の目で確かめてみていただきたいという思いもあります。

関連記事

GDKメソッド使用例の紹介
GroovyなJDK、それがGDK - No Programming, No Life

*1:[http://jira.codehaus.org/browse/GROOVY-4181:title=ここ]とか[http://jira.codehaus.org/browse/GROOVY-4696:title=ここ]とかを参照。