2014-09-04 55 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格式化程序。如果该行太长,则格式化程序会将下一个功能移到其下面。