Java中如何实现方法链式?

问题描述 投票:0回答:4

我想用Java实现方法链。

我怎样才能实现它?

也让我知道何时使用它。

public class Dialog {

     public Dialog() {

     }

     public void setTitle(String title) {

         //Logic to set title in dialog
     }

     public void setMessage(String message) {

         //Logic to set message
     }     

     public void setPositiveButton() {

         //Logic to send button
     }
}   

我想创建可以使用的方法链,如下所示:

new Dialog().setTitle("Title1").setMessage("sample message").setPositiveButton();

或者喜欢

new Dialog().setTitle("Title1").setMessage("sample message");

或者喜欢

new Dialog().setTitle("Title1").setPositiveButton();
java methods chaining
4个回答
116
投票

让你的方法返回

this
,例如:

public Dialog setMessage(String message)
{
    //logic to set message
    return this;
}

这样,每次调用其中一个方法后,您都会返回相同的对象,以便您可以调用另一个方法。

当您想要对对象调用一系列方法时,此技术非常有用:它减少了实现该目的所需的代码量,并允许您在方法链之后获得单个返回值。

减少显示对话框所需代码量的示例如下:

// Your Dialog has a method show() 
// You could show a dialog like this:
new Dialog().setMessage("some message").setTitle("some title").show();

使用单个返回值的示例是:

// In another class, you have a method showDialog(Dialog)
// Thus you can do:
showDialog(new Dialog().setMessage("some message").setTitle("some title"));

丹尼斯在您的问题的评论中提到的使用构建器模式的示例:

new DialogBuilder().setMessage("some message").setTitle("some title").build().show();

构建器模式允许您在构建对象之前为类的新实例设置所有参数(考虑具有

final
字段或对象的类,在构建后设置值比在构建后设置值更昂贵)它已构建)。

在上面的示例中:

setMessage(String)
setTitle(String)
属于
DialogBuilder
类,并返回它们被调用的
DialogBuilder
的相同实例;
build()
方法属于
DialogBuilder
类,但返回一个
Dialog
对象
show()
方法属于
Dialog
类。

额外

这可能与您的问题无关,但它可能会对您和遇到此问题的其他人有所帮助。

这适用于大多数用例:所有不涉及继承的用例以及当派生类未添加您想要链接在一起的新方法时涉及继承的某些特定情况并且您对使用不感兴趣(不进行强制转换)方法链的结果作为派生对象。

如果您想要对基类中没有方法的派生类对象进行方法链接,或者您希望方法链将对象作为派生类的引用返回,您可以查看这个问题的答案。


8
投票

只需添加一个静态构建器方法,并创建另一组设置器方法。 例如

class Model {
   private Object FieldA;

   private Object FieldB;

   public static Model create() {
       return new Model();
   }

   public Model withFieldA(Object value) {
       setFieldA(value);
       return this;
   }

   public Model withFieldB(Object value) {
       setFieldB(value);
       return this;
   }
}

...

并像这样使用它

 Model m = Model.create().withFieldA("AAAA").withFieldB(1234);

1
投票

减少显示对话框所需的代码量的示例是:

package com.rsa.arraytesting;

public class ExampleJavaArray {

String age;
String name;

public ExampleJavaArray getAge() {
    this.age = "25";
    return this;
}

public ExampleJavaArray setName(String name) {
    this.name = name;
    return this;
}
public void displayValue() {
    System.out.println("Name:" + name + "\n\n" + "Age:" + age);
}
}

又一堂课

package com.rsa.arraytesting;

public class MethodChaining {

public static void main(String[] args) {

    ExampleJavaArray mExampleJavaArray = new ExampleJavaArray();

    mExampleJavaArray.setName("chandru").getAge().displayValue();

}

}

0
投票

如果您使用lombok,您可以在

lombok.config
中使用参数:

lombok.accessors.chain = true

或者对于特定的数据类,您可以声明

@Accessors(chain = true)
注释:

import lombok.experimental.Accessors;

@Accessors(chain = true)
@Data
public class DataType {

    private int value;

    // will generate setter:
    public DataType setValue(int value) {
        this.value = value;
        return this;
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.