Java链式编程接口

在android开发中显示一个AlertDialog时,常采用下列的写法:

复制代码
new AlertDialog.Builder(getApplicationContext())
        .setTitle("Dialog")
        .setMessage("Link program")
        .setPositiveButton("OK", new OnClickListener() {
            
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //TODO
                
            }
        })
        .show();
复制代码

可以注意到setTitle/setMessage/setPositiveButton等接口都是直接紧接着执行,用点号隔开,这样的方法叫做链式编程。

观看setTitle,setMessage等源码会发现,每个方法(接口)的返回值都是AlertDialog.Builder类型,所以秘诀在于方法的返回值类型都必须与第一个点号前面的类型保持一致:

复制代码
/**
         * Set the title displayed in the {@link Dialog}.
         *
         * @return This Builder object to allow for chaining of calls to set methods
         */
        public Builder setTitle(CharSequence title) {
            P.mTitle = title;
            return this;
        }

/**
         * Set the message to display.
          *
         * @return This Builder object to allow for chaining of calls to set methods
         */
        public Builder setMessage(CharSequence message) {
            P.mMessage = message;
            return this;
        }
复制代码

 

这样写法的好处在于一方面可以尽可能少去进行类型转换的判定,而且大大增强了代码的阅读性,同时也减少了代码量。

下面通过一个小例子来演示如何制作这样的链式编程接口

复制代码
public class LinkProgram {

    private String mText;
    private int mId;
    private boolean isAdd;
    
    public static void main(String[] args) {

        LinkProgram link = new LinkProgram();
        
        //链式接口调用时,返回值类型和link该对象类型保持一致
        link.setAdd(true)
            .setId(5)
            .setText("hello world");
        
        System.out.println(link);

    }
    
    @Override
    public String toString() {
        return "Text:" + mText + ", Id:" + mId + ", add:" + isAdd;
    }

    //返回值类型为LinkProgram
    public LinkProgram setText(String mText) {
        this.mText = mText;
        return this;
    }

    //返回值类型为LinkProgram
    public LinkProgram setId(int mId) {
        this.mId = mId;
        return this;
    }

    //返回值类型为LinkProgram
    public LinkProgram setAdd(boolean isAdd) {
        this.isAdd = isAdd;
        return this;
    }
    
}
复制代码

运行结果:
Text:hello world, Id:5, add:true

 

posted @   soaringEveryday  阅读(6522)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示