1

我正在尝试有效的 Java 书籍并享受它。我阅读了 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 之前没有抱怨,但我很确定这就是问题所在......)

编辑:现在它没有抛出异常,看看你的“setter”方法:

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 回答