为什么android中的AlertDialog要用一个内部的static class Builder来创建呢?

泡在网上的日子 / 文 发表于2013-05-27 21:24 次阅读 Builder

最近看一些android的代码,发现他的AlertDialog是需要用类似下面的代码来创建的:

new AlertDialog.Builder(this)
    .xxxx

进入到AlertDialog的源代码,可以看到AlertDialog是继承于Dialog,并且他的构造函数都是声明成protected的。而Builder是一个内部的public static class. Builder的大部分方法是在设置一个AlertController.AlertParams 的object.只有在调用Builder.create或者show的时候(其实show也是先调用了create),才会真正的new一个AlertDialog的对象,并且把AlertParams的某些参数设置给这个AlertDialog对象。

但是我始终没想明白这样做会带来什么特别的效果或者说好处。只是为了结构上看起来稍微清晰一点?还是有深层次的含义呢?

结论:这是一个builder模式构建复杂对象的应用。在Builder.create中,或者在params的设置中,就能够实现对AlertDialog本身的约束规则。AlertDialog声明protected的构造函数就防止了外部代码不通过build而直接去new对象,造成约束失败的情况。


网友的回答

关于这个问题,我说一下我的想法:
这其实是Java中的一个很重要的设计模式,不知道你注意到没有,Builder#setXXX()方法的返回值都是返回Builder,也就是返回this,这样使用的时候,就可以使用链式的方式来调用方法。

这种方式我记得在《Effective Java》一书中开头部分讲过,在什么情况下用这种方式来创建实例对象呢,一般情况下,当时我们要设计很多参数时,用这种方式比较好,你想,你要设置dialog,要设置很参数,比如title, icon, view, button, listener等,而dialog方法提供的方法用起来不方便,所以AlertDialog就搞了这么一种方式。

收藏 赞 (0) 踩 (0)
上一篇:Android应用设计:从糟糕到成熟
Nielsen最近的研究数据表明,Android系统的设备已经在数量上超过iOS系统了,所以并不难看出Android市场的繁荣正如日中天:有4.8亿的用户正在使用Android设备,每天有100万个新的设备被激活。这意味着,每三个星期,新激活的Android设备数几乎等于整个澳大利
下一篇:交互设计之滑动的维度
前言 在iOS交互模型的最底层,有一个“空间”的概念,而空间最基本的属性就是三个维度。滑动依存于屏幕这个二维环境,也可以从维度这个角度去思考。最常见的滑动例如ios里删除短信息的操作,这里的滑动是最基础的,可以理解成一维的、被赋予了唯一功能的操作