[英]How to achieve method chaining in Java?
我想在 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();
有你的方法返回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"));
使用丹尼斯在对您的问题的评论中提到的 Builder 模式的示例:
new DialogBuilder().setMessage("some message").setTitle("some title").build().show();
构建器模式允许您在构建对象之前为类的新实例设置所有参数(考虑具有final
字段的类或在构建后为其设置值比在构建时设置值更昂贵的对象) .
在上面的例子中: setMessage(String)
、 setTitle(String)
属于DialogBuilder
类并返回它们被调用的相同DialogBuilder
实例; build()
方法属于DialogBuilder
类,但返回一个Dialog
对象show()
方法属于Dialog
类。
额外的
这可能与您的问题无关,但它可能会帮助您和遇到此问题的其他人。
这适用于大多数用例:所有不涉及继承的用例和一些涉及继承的特定情况,当派生类没有添加您想要链接在一起的新方法并且您不感兴趣使用(不进行强制转换) ) 方法链的结果作为派生对象。
如果您想为基类中没有方法的派生类的对象使用方法链,或者您希望方法链将对象作为派生类的引用返回,您可以查看答案对于这个问题。
只需添加一个静态构建器方法,并创建另一组 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;
}
}
...
并使用它
Model m = Model.create().withFieldA("AAAA").withFieldB(1234);
减少显示对话框所需的代码量的示例是:
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();
}
}
如果你使用 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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.