2014-09-04 23 views
1

在java中有一種類型的語句,我無法理解甚至通過Google搜索找到任何有關的內容。我想和大家分享我寫的,但不理解的語言結構的例子:以點開頭的Java多重函數

MvcResult result = this.mockMvc.perform(MockMvcRequestBuilders.post("/user_sessions/first") 
       .contentType(MediaType.APPLICATION_JSON) 
       .content("{\"username\":\""+username+"\",\"password\":\""+password+"\"}")) 
       .andExpect(MockMvcResultMatchers.status().isOk()) 
       .andReturn(); 

我不明白的contentType,內容,andExpect和andReturn是。他們顯然是功能,但我怎麼能這樣稱呼他們。他們屬於哪個班級?總的來說,我對這裏的結構非常困惑。

謝謝。

+0

它被稱爲方法鏈,'StringBuilder'的'append'方法可以讓你做到這一點。基本上這些方法正在返回一個'MvcResult'('return this')的實例,它允許你將方法調用連接在一起。它在構建器模式中特別受歡迎,並節省了大量的輸入... – MadProgrammer 2014-09-04 08:14:28

+0

您對'this.mockMvc.perform(MockMvcRequestBuilders.post(「/ user_sessions/first」)的結果調用'contentType(...)' '等,等等 – amit 2014-09-04 08:14:41

回答

5

你在這裏看到的是一個流暢的界面。流暢的接口是一種通過級聯方法調用來幫助提高代碼可讀性的機制。當你創建一個方法的返回值是類的,所以在僞代碼,這將是這樣的 -

class Foo { 
    private String baa; 
    private String moo; 
    public Foo setBaa(String baa) { 
    this.baa = baa; 
    return this; 
    } 
    public Foo setMoo(String moo) { 
    this.moo = moo; 
    return this; 
    } 
} 

注:使用此作爲返回值,表明我們正在返回我們目前FOO實例。這將允許folliwng行爲 -

Foo test = new Foo(); 
test.setBaa("baa").setMoo("moo"); 

如果您想了解流利接口的更多信息,請看看http://en.wikipedia.org/wiki/Fluent_interface這給了相當深入的解釋。

+0

+1指出「流暢的界面」是這種方法設計的正確術語,它是一個更具體的情況,簡單的方法鏈接 – 2014-09-04 08:23:14

+0

雖然在流暢的界面中,它通常是**不是與返回的類相同**爲了讓用戶通過流暢接口的不同階段,返回不同的類型以提供不同的方法選項。 – 2014-09-04 08:32:27

1

這樣做是爲了更好的可讀性。您也可以將它寫爲:

result = this.mockMvc.perform(MockMvcRequestBuilders.post("/user_sessions/first").contentType(MediaType.APPLICATION_JSON).content("{\"username\":\""+username+"\",\"password\":\""+password+"\"}")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn(); 

所有這些方法都會返回對象,並在返回的對象上調用以下方法。

0

我認爲你是混淆與您的片段

MvcResult result = this.mockMvc.perform(MockMvcRequestBuilders.post("/user_sessions/first") 
       .contentType(MediaType.APPLICATION_JSON) 
       .content("{\"username\":\""+username+"\",\"password\":\""+password+"\"}")) 
       .andExpect(MockMvcResultMatchers.status().isOk()) 
       .andReturn(); 

看看它不會與一個semi colon這意味着該行不會終止結束第一道防線。

至於SURESH ATTA的答案。它是方法鏈,它們都屬於MvcResult並且取決於函數的返回類型。

你很困惑,每行都以dot開頭,然後是函數名。這可能是因爲你的IDE格式化程序。如果該行太長,則格式化程序會將下一個功能移到其下面。