【问题标题】:Need explanation on this Java object initialization syntax需要解释这个 Java 对象初始化语法
【发布时间】:2014-08-20 08:08:10
【问题描述】:

我是一名 C\C++ 程序员,刚从 Java 开始。

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

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 声明吗?

附: 不要认为这很重要,但 Java sn-p 来自 Android 程序。

【问题讨论】:

  • 您也可以在 C++ 中使用相同的语法,只需让成员函数返回 this,您就可以将调用链接在一起。
  • @JoachimPileborg 你的意思是*this,我猜:-)
  • @Spurdow:这不是建造者模式。
  • @Angew 这取决于你想如何链接它,使用点语法或箭头语法。 :)

标签: java android c++ syntax object-initialization


【解决方案1】:

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

public object SetContent(final String input){
    this.aaa = input;
    return this;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      它是method chaining,每个方法调用都返回调用它的对象。在 Java 中使用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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          例子:

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

          上面的方法可以这样调用:

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

          更全面深入的解释可以看here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-23
            相关资源
            最近更新 更多