2012-05-06 16 views
1

私は効果的なJavaブックを試しており、それを楽しんでいます。私はBuilderのパターンを読んで、それを試してみました。ビルダーパターンに一致するコンストラクターエラーが見つかりませんでした

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 
     } 

    } 
} 

しかし、私はこのようなエラーが出ます:私は(Groovyで)このようなコードを持っている、これはなぜ起こるか私にはわからない

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) 

!どこが間違っていた?

+0

流暢なJavaスタイルではなく、グルーヴィービルダーを作成してみませんか? ;-) –

+0

@tim_yates:確かにそれを試してみましょう... :) –

答えて

5

これはあなたのbuild()方法である:あなたのJavaクラスで

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

ルック(ないBuilder) - それは、明示的に宣言されたコンストラクタを持っていないので、それが持っている唯一のコンストラクタは、公開パラメータなしの1であります自動的にあなたのために宣言されます。

あなたは、これを移動する必要があります。Builderクラス外

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

。今では例外を投げていないことを、あなたの「セッター」メソッドを見て:

EDIT(...私は少し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 
} 
+0

はい、それは愚かな間違いです。今それは動作します。しかし、 'build'メソッドを使ってオブジェクトを作成すると、' new Java.Builder(100).author( "aa")。release_number(90).build() 'というエラーがあります。私は 'author'値を印刷しようとしたときに**何も印刷されません**。 –

+0

@Ant's:編集中... –

+0

ありがとう!どちらも非常にばかげた過ちです!ありがとう。 。 。 –

関連する問題