一个有点奇怪的java代码,它是如何工作的?

时间:2013-07-26 17:41:16

标签: java

这段代码是如何工作的?

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

我们不应该像

那样
cb.setOAuthConsumerKey("") etc..

取自here

7 个答案:

答案 0 :(得分:12)

这些方法旨在允许method chaining

为此,他们只是return this

例如:

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

今天,这种模式相当流行,因为它允许稍微冗长的代码。

在Java中使用它太多导致了一个问题,因为:由于Java方法只能返回一个值,因此您失去了返回更多有用值的可能性,并且在实践中,您最终会得到一个不一致的代码,其中大多数但是并非所有方法都遵循此模式。它仍然是实用的,特别是对于您最初直接定义为类的参数的对象的构建和配置,但是您应该注意不要过度使用它。

答案 1 :(得分:3)

这是“builder pattern”的简单版本。每个方法返回this,因此调用者可以将许多调用链接在一起,而不必多次提供对象名称。

答案 2 :(得分:1)

每个方法在更改内容后返回原始引用,这使您可以链接这样的方法。

答案 3 :(得分:1)

这是在源文件中将一行代码拆分为多行的示例,即使它仍然技术上一行代码。

没有换行符,它看起来像这样:

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

多行版本的工作原因是因为回车不是Java中的语句终止符。 (它在某些语言中,例如VB。)因此,在遇到分号之前,编译器会继续将代码作为单个语句执行。

代码分为多行,纯粹是为了便于阅读。 (请记住,代码主要是由人类阅读,并且只有次要的次要目的是由机器执行。)

答案 4 :(得分:0)

这被称为“构建器模式”。每次调用方法都会返回对象实例,因此你可以在“chain”中编写对这些方法的许多调用。

答案 5 :(得分:0)

检查javadoc是否可用。我怀疑setter有一个返回类型的ConfigurationBuilder而不是void。换句话说,制定者的结尾如下:

return this;

答案 6 :(得分:0)

方法链

class Demo{

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

}

此模式最常用于Builder Pattern。

这样做是为了提供简洁的单行调用来配置对象并在Builder中创建对象的实例。

而不是这种类型的电话:

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

代码变为单行和可读格式:

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