new AlertDialog.Builder(this).setxx引发的胡思乱想

一、前言

今天写着alertDialog0,突然想到直接new一个alertDialog对象 为何此种写法。直观上的感觉是这是用builder模式来创建对象。

二、建造者模式

印象中的建造者模式一直是以前项目中那样,对象的建造过程有固定的模式,而这种模式和他的实现无关。有一个builder借口,定义这个建造过程方法。具体的builder实现类来实现。
我们一般搞一个导演类,传入一个builder对象作为导演类的构造参数,调用导演类的construt(或者叫build)函数构建对象。

之前我们项目是自动生成项目后台代码,我们是自动生成java类对象(包名,导入包,属性,方法)
大话设计模式中举例是说 构建一个人,先构建头,手之类的

三、为何dialog使用builder模式

很明显这里不是为了上面的这种常见的builder模式的场景,网上查了一下,alertDialog的成员变量诸多。构造对象有两种选择
1. 写多个构造函数,每个构造函数包含多个不同的参数这种写法可能会导致我们有时需要传入null作为参数(参数最多的一种包含所有成员变量,这种通用性非常强)。但是这样看起来非常臃肿,而且传入null总让人感觉怪怪的
2. 我们只写包含最通用的参数最少的构造方法,其他的通过get/set来给参数赋值

但是这种可能会导致我们的对象没有完全创建(语义上的没有完全创建,比如说我们需要构造名为小明,12岁,男,六年级)的对象,但是我们构造函数提供了姓名年龄,我们set了性别,但是没有set年级,这时泄漏出去的对象,其实不是我们所需要的对象。这时严重不合理的。
这时我们可以使用builder比如builder中提供同样的构造函数(姓名、年龄)后面set完性别和年龄之后调用create才会创建
这样能很大程度上避免上面所述的缺点

Builder bulder = new StudentBuilder(name,age).setSex(male).setGrade(6);
Student student = bulder.create();

四、一般用Builder创建对象的一般方法

  1. 一般builder作为目标类的内部类,目标类构造函数设为protected强制使用builder来构造对象。
  2. 一般进一步取消目标类中的set方法,那么该类的对象将会成为不可变对象(不考虑反射的情况)。
    不太明白到底有没有必要将其做成那种不可变对象。
    如何创建不可变对象和最常见的不可变对象String则涉及到另一个话题参考资料2、3、4
    不可变对象的应用场景有待思考、思考、思考说三遍

五、AlertDialog中的Builder方法

Builder构造函数

  P = new AlertController.AlertParams(new ContextThemeWrapper(
                    context, resolveDialogTheme(context, theme)));
构造了一个AlertController对象P,从源码中可以看出,之后的setTitle之类的信息都是set到了这个对象中。

AlertDialog.Builder的public AlertDialog create

final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
            P.apply(dialog.mAlert);
            ....
  1. 首先看第一句new AlertDialog
.....
  mWindow.alwaysReadCloseOnTouchAttr();
  mAlert = new AlertController(getContext(), this, getWindow());

就是说Builder.craete的时候创建了一个AlertController对象malert
3. 再看第二句P.apply(dialog.mAlert);
这句是将之前set进P对象的信息全部赋给AlertDialog中AlertController类的对象mAlert,然后返回创建的对象。(该对象只是个空架子,真正核心的东西在AlertController里面)该类是android内部类,可以用source Insight追踪

其实在看源码的时候一直奇怪为什么搞个AlertController,联想到之前看到的Facebook的图片加载控件Fresco
亲,刷新试试
感觉应该不是巧合,这么做应该是处于某些方面的考虑。目前层次太低,说不出个所以然
回头还要去请大神指教

六、参考资料

  1. 使用Builder模式创建对象
  2. 如何用建造者模式创建不可变类
  3. 如何写一个不可变类
  4. Java中的String对象是不可变的吗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值