2013-07-26 46 views
1

此代碼是如何工作的?有點奇怪的java代碼,它是如何工作的?

 ConfigurationBuilder cb = new ConfigurationBuilder(); 
       cb.setDebugEnabled(true) 
       .setOAuthConsumerKey("") 
       .setOAuthConsumerSecret("") 
       .setOAuthAccessToken("") 
       .setOAuthAccessTokenSecret(""); 

不應該我們必須把像

cb.setOAuthConsumerKey("") etc.. 

here

+0

你的問題不清楚 - 你問級聯格式? – alfasin

+0

只需查看所調用方法的簽名即可得到它。 – A4L

回答

13

這些方法都是爲了讓method chaining服用。

爲此,他們只需return this

例如像這樣:

public ConfigurationBuilder setDebugEnabled(boolean debugEnabled) { 
    this.debugEnabled = debugEnabled; 
    return this; 
} 

這種模式,在今天,而受歡迎,因爲它允許略少冗長的代碼。

但是,在Java中使用它太多會導致一個問題:由於Java方法只能返回一個值,因此您失去了返回更多有用值的可能性,並且實際上最終會出現不一致的代碼,其中大多數但並非所有方法都遵循這種模式。它仍然是可行的,尤其是對於最初直接定義爲類的參數來構建和配置對象,但是您應該小心,不要過度使用它。

+0

你能給我一些示例代碼或鏈接,所以我可以更好地理解它嗎?另外,請解釋投票的原因。 – mjamal14

3

這是'builder pattern'的簡單版本。每種方法都會返回this,因此調用者可以將多個調用鏈接在一起,而無需多次提供對象名稱。

1

這些方法中的每一個都會在更改某些內容後返回原始引用,從而使您可以像這樣鏈接方法。

0

這就是所謂的「生成器模式」。每次調用方法都會返回對象實例,因此可以在「鏈」中編寫多個對這些方法的調用。

1

這是一個將源代碼文件中的一行代碼分成多行的示例,即使它仍然是技術上的單行代碼。

沒有斷行,它看起來像這樣:

cb.setDebugEnabled(true).setOAuthConsumerKey("").setOAuthConsumerSecret("").setOAuthAccessToken("").setOAuthAccessTokenSecret(""); 

多行版本的作品的原因是因爲回車不是Java中的語句終止。 (它在某些語言中,如VB)。因此,直到遇到分號,編譯器將繼續以單個語句執行代碼。

爲了便於閱讀,代碼被分成多行。 (請記住,編寫的代碼主要是爲人類閱讀,並且只有次要目的是由機器執行。)

0

檢查javadoc是否可用。我懷疑setter有一個返回類型的ConfigurationBuilder而不是void。換句話說,設置器這樣結束:

return this; 
0

方法鏈接

class Demo{ 

    public Demo someMethod(){ 
     //some operations 
     return this; //returns the instance of self 
    } 

} 

該圖案在生成器模式最常用的。

這樣做是爲了提供簡潔的單行調用來配置對象並在Builder中創建對象的實例。

而不是這樣的呼叫類型:

obj.method1(); 
obj.method2(); 
obj.method3(); 

的代碼被改爲單行和可讀的格式:

obj.method1().method2().method3();