1

私はEffective Java bookを試して楽しんでいます。Builder パターンを読んで、それで遊んでみました。私はこのようなコードを持っています(Groovyで):

public class Anto {
    public static void main(String[] args) {

            def testing = new Java.Builder(1).author("antoaravinth").build()
            println testing.author
        }
}

class Java {
    int version
    def author
    int release_number

    public static class Builder {
        int version

        def author = ""
        int release_number = 0

        public Builder(int version) {
            this.version = version
        }

        public Builder version(int version)
        {
            version = version
            return this
        }

        public Builder author(def author)
        {
            author = author
            return this
        }

        public Builder release_number(int release_number)
        {
            release_number = release_number
            return this
        }

        public Java build() {
            return new Java(this);
        }


        private Java(Builder builder) 
        {
            version = builder.version
            author = builder.author
            release_number = builder.release_number
        }

    }
}

しかし、次のようなエラーが発生します:

Caught: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: Java(Java$Builder)
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: Java(Java$Builder)
    at Java$Builder.build(Anto.groovy:43)
    at Java$Builder$build.call(Unknown Source)
    at Anto.main(Anto.groovy:4)

なぜこれが起こるのかわかりません!どこで間違ったのですか?

4

1 に答える 1

5

これはあなたのbuild()方法です:

public Java build() {
    return new Java(this);
}

Javaクラス(ではなく)を見てください。Builder明示的に宣言されたコンストラクターがないため、クラスにあるコンストラクターは、自動的に宣言されたパラメーターのないパブリックコンストラクターだけです。

これを移動する必要があります:

private Java(Builder builder) 
{
    version = builder.version
    author = builder.author
    release_number = builder.release_number
}

Builderクラスの外。(Groovyが以前に文句を言わなかったことに少し驚いていますが、それが問題だと確信しています...)

編集:例外をスローしていないので、「セッター」メソッドを見てください。

public Builder version(int version)
{
    version = version
    return this
}

このversion = version行は何もしません。パラメータとフィールドを区別する必要があります。例:

public Builder version(int version)
{
    this.version = version
    return this
}

...または、パラメータに別の名前を付けることによって、たとえば

public Builder version(int value)
{
    version = value
    return this
}
于 2012-05-06T06:45:31.357 に答える