【问题标题】:What is the difference between void method and return thisvoid方法和return this有什么区别
【发布时间】:2017-01-17 22:35:15
【问题描述】:
Class Player {
Player setName(String name){
this.name = name;
return this;

// or

void setName(String name){
this.name = name;
}}

嗨。如果我使用带有“void”或“return this”语句的方法有什么区别?为什么存在“return this”语句,如果它是一样的?

【问题讨论】:

  • java 是按值传递的。如果你返回,这就像你在返回指针。作为回报的好处是您可以返回在方法中创建的引用。参考:stackoverflow.com/questions/40480/…

标签: java return this void setter


【解决方案1】:

第一个用于链接方法(构建器模式),而第二个是普通的 setter 方法

【讨论】:

    【解决方案2】:

    为什么“return this”语句存在,如果它是一样的?

    他们不会远程做同样的事情。

    void 方法没有返回值。这意味着您不能使用返回值(例如,您不能将其分配给变量)。

    有返回值的方法有返回值。在您提到的特定情况下,return this,它返回对调用该方法的对象的引用,因此您可以(可能)使用该引用——通过将其分配给一个变量,通过在其上调用另一个方法等。这对于 fluent interfaces(允许您进行大量链接的)很有用:

    theObject.doThis().thenDoThat().thenDoSomethingElse();
    

    如果是void,你必须这样写:

    theObject.doThis();
    theObject.thenDoThat();
    theObject.thenDoSomethingElse();
    

    这个1最著名的例子可能是对象构造的Builder pattern,因为这意味着你不需要变量:

    Thingy t = new ThingyBuilder()
        .withFoo("foo")
        .withBar("bar")
        .withBaz("baz")
        .build();
    

    1 最著名的 Web 开发之外的圈子,即; web 开发圈内,最著名的例子是 jQuery 的 API:$("div").css("color", "green").text("Good");

    【讨论】:

    • 感谢您的精彩回答。我已经在阅读有关链接或相当流畅的接口的信息,但并没有真正了解它是如何工作的。一直单独理解材料学习是非常困难的。
    【解决方案3】:

    当您return this 时,您返回一个Player 实例。

    在 Builder 模式中更常用,它返回一个名为 Joe 的 Player。

    Player p = new Player().setName("Bob").setName("Joe");
    

    使用void 方法,您不能执行第二个setName。为了重命名播放器,您必须获取播放器对象的第一个实例,然后在下一行再次调用setName

    显然,这是一个简单的例子,但当你有很多这样的 setter 时会更有用

    new Player()
      .setName("Bob")
      .setAge(42)
      .setGender("male")
    

    不过,我认为这里的惯例是使用withX 而不是setX

    【讨论】:

      【解决方案4】:

      返回this 允许链接,例如:

      player.setName(...).setSomethingElse(...)

      当返回 void 时,没有对象引用,因此无法进行链接,您的代码如下:

      player.setName(...); player.setSomethingElse(...);

      【讨论】:

        【解决方案5】:

        我想知道为什么人们会问什么都不返回和返回一些东西是一样的。反正:不,有回报和什么都不回报是不一样的。

        返回this主要用于允许“流畅”的接口,以便您的类的用户可以编写

        yourObject.setFoo(foo).setBar(bar).doSomething();
        

        而不是

        yourObject.setFoo(foo);
        yourObject.setBar(bar);
        yourObject.doSomething();
        

        这是否有助于提高可读性可能取决于您和其他使用该源代码的人所习惯的风格。一种严重依赖于编写此类代码的典型模式是Builder pattern

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-24
          • 2013-06-02
          • 2011-08-26
          • 1970-01-01
          • 1970-01-01
          • 2010-11-06
          相关资源
          最近更新 更多