2012-05-06 42 views
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) 

我不知道爲什麼會這樣!我哪裏出錯了?

+0

爲什麼不寫一個groovy builder而不是流利的java風格呢? ;-) –

+0

@tim_yates:當然會試一試... :) –

回答

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 
} 
+0

是的,這是一個愚蠢的錯誤。現在它可以工作。但是,當我使用'build'方法創建一個對象時:'new Java.Builder(100).author(「aa」)。release_number(90).build()',我猜它有一些錯誤。當我試圖打印'author'值時,我得到**沒有任何**打印。 –

+0

@ Ant's:編輯... –

+0

謝謝!這兩個都是非常愚蠢的錯誤!謝謝。 。 。 –

相關問題