如何在java中实现方法链接?

Bug*_*Bug 45 java methods chaining

我想在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
     }
}   
Run Code Online (Sandbox Code Playgroud)

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

new Dialog().setTitle("Title1").setMessage("sample message").setPositiveButton();
Run Code Online (Sandbox Code Playgroud)

或者喜欢

new Dialog().setTitle("Title1").setMessage("sample message");
Run Code Online (Sandbox Code Playgroud)

或者喜欢

new Dialog().setTitle("Title1").setPositiveButton();
Run Code Online (Sandbox Code Playgroud)

luc*_*mon 93

你的方法返回this如下:

public Dialog setMessage(String message)
{
    //logic to set message
    return this;
}
Run Code Online (Sandbox Code Playgroud)

这样,在每次调用其中一个方法之后,您将获得返回的相同对象,以便您可以调用另一个方法.

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

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

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

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

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

使用Dennis在您的问题评论中提到的Builder模式的示例:

new DialogBuilder().setMessage("some message").setTitle("some title").build().show();
Run Code Online (Sandbox Code Playgroud)

构建器模式允许您在构建对象之前为类的新实例设置所有参数(考虑具有final字段或对象的类,在构建值之后设置值比在构造对象时设置值更昂贵).

在上面的例子:setMessage(String),setTitle(String)属于DialogBuilder类和返回相同的实例DialogBuilder,他们正在呼吁; 该build()方法属于DialogBuilder该类,但返回Dialogshow()方法属于Dialog该类的对象.

额外

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

这非常适用于大多数使用情况:所有用例不涉及继承和涉及继承时派生类中不添加要链接在一起的新方法的一些特殊情况你不热衷于使用(不含铸造)方法链的结果作为派生的对象.

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


Vag*_*gif 8

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

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

...

并使用它

 Model m = Model.create().withFieldA("AAAA").withFieldB(1234);
Run Code Online (Sandbox Code Playgroud)