4

我是一个C\C++刚开始的程序员Java

我遇到了这个有效的 Java 片段语法,我理解它的作用,但我无法理解语法的逻辑。

object x = new object
            .SetContent(aaa)
            .SetIcon(bbb)
            .SetText(ccc);

我知道等效的C++代码是:

object* x = new object;

x->SetContent(aaa);
x->SetIcon(bbb);
x->SetText(ccc);

谁能向我解释 Java 语法中的逻辑?
这类似于 Visual Basic 的With声明吗?

PS 不要认为这很重要,但 Java 代码片段来自 Android 程序。

4

5 回答 5

4

这些链式调用是可能的,因为每个 setter 方法都返回对 的引用this

public object SetContent(final String input){
    this.aaa = input;
    return this;
}
于 2014-08-20T08:11:42.563 回答
2

这是method chaining in java,其中每个方法都返回当前实例,以便您可以从该方法调用当前返回的对象的下一个方法。

于 2014-08-20T08:11:05.923 回答
0

它是方法链,每个方法调用都返回调用它的对象。在 Java 中创建带有 a 的对象时很常见Builder,例如

Foo foo = FooBuilder.builder()
    .setBar("bar")
    .setVolume(11)
    .setAnswer(42)
    .build();

其中每个.set___()方法返回更新的构建器对象,最终build()调用返回实际Foo实例。这样做完全等效:

FooBuilder builder = FooBuilder.builder();
builder = builder.setBar("bar");
builder = builder.setVolume(11);
builder = builder.setAnswer(42);
Foo foo = builder.build();

但 IMO 的第一个版本更具可读性。我不是一个 C++ 人,但我认为你可以在那里做同样的事情。

编辑:这是一个真实的例子: http ://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableSet.Builder.html

于 2014-08-20T08:16:01.700 回答
0

该实例Object由每个调用的方法返回,下一个后续方法使用该返回的实例进行进一步操作。这是通过返回在内部完成的this

例子:

Object methodFirst(Object ob1)
{
ob1.doSomeOperations();
return this;
}

Object methodSecond(Object ob1)
{
ob1.doSomeOtherOperations();
return this;
}

上述方法可以这样调用:

Object newObject = oldObject.methodFirst().methodSecond(); 

更全面、更深入的解释可以在这里找到

于 2014-08-20T08:22:08.523 回答
0

这个语法是创建'x'对象,你应该知道对象是Java中的引用。此语法等价于:

private object x = new object();
x.setContent(aaa);
x.setIcon(bbb);
x.setText(ccc);

所以首先它创建对象,然后调用每个方法。

于 2014-08-20T08:17:09.223 回答