android 空对象为空,android 常用的设计模式之Null Object 设计模式

本文介绍了一种在Android中处理复杂场景下通过switch语句创建不同Adapter的方法,使用抽象基类、接口和工厂模式避免空指针问题,提升代码健壮性。通过实例展示了如何创建BaseAdapter、具体Adapter和NullAdapter,以及BaseFactory的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个设计模式在Android中的用处不是太多,但是也有情况会用的到,对程序的扩展和健壮有很大的作用,也能比较好定位问题,所以我也是在网上找了资料然后根据场景谢了这个博客来记录一下自己所学习到的知识点。

首先说一下场景,比较适用于我们通过switch语句进行判断来创建对象的时候,app的首页我们知道都是比较复杂的,这个时候我们会根据服务器给的不同的item显示类型来创建不同的itemAdapter用来展示行内容,所以我们首先创建一个BaseAdapter,比较简陋的代码,这里需要你们集成Android自己的RecycleAdapter来实现布局展示逻辑,我这里省略了,代码如下:

abstract public classBaseAdapter implementsNullableInterface{

private static finalString TAG= "BaseAdapter";

@Overridepublic voiddoAction() {

isNull();doSomeThing();}

@Overridepublic booleanisNull() {

Log.e(TAG+ " - lcs - ","对象不为空!!!");return false;}

abstract voiddoSomeThing();}

首先这是个抽象类,为了暴露给子类我们的doSomeThing方法,这里我们还要实现自己的接口NullableInterface,代码如下:

public interfaceNullableInterface {

voiddoAction();

booleanisNull();

}

然后我们在定义实际中我们所需要的行itemAdapter,这里随便写了两个,第一个OneAdapter,代码如下:

public classOneAdapter extendsBaseAdapter {

private static finalString TAG= "OneAdapter";

@OverridevoiddoSomeThing() {

Log.e(TAG+ " - lcs - ","OneAdapter is doing something");}

}

第二个TwoAdapter,代码如下:

public classTwoAdapter extendsBaseAdapter{

private static finalString TAG= "TwoAdapter";

@OverridevoiddoSomeThing() {

Log.e(TAG+ " - lcs - ","TwoAdapter is doing something");}

}

接下来还有一个最重要的我们的空指针的时候我们的对象的adapter,NullAdapter,代码如下:

public classNullAdapter extendsBaseAdapter implementsNullableInterface {

private static finalString TAG= "NullAdapter";

@Overridepublic voiddoAction() {

isNull();doSomeThing();}

@Overridepublic booleanisNull() {

Log.e(TAG+ " - lcs - ","警告! 对象为空!!!");return true;}

@OverridevoiddoSomeThing() {

Log.e(TAG+ " - lcs - ","NullAdapter is doing something");}

}

可以看到我们的log打印的代码都有标记。

最后我们的工厂类,BaseFactory,代码如下:

public classBaseFactory {

public staticBaseAdapter create(String type){

BaseAdapter baseAdapter = null;

switch(type) {

case"1":

baseAdapter = newOneAdapter();break;case"2":

baseAdapter = newTwoAdapter();break;default:

baseAdapter = newNullAdapter();break;}

returnbaseAdapter;}

}

可以看到我们的默认default我们返回的不是null,而是我们自己定义的空指针的Adapter,然后再测试代码:

for(inti = 0;i < 3;i++) {

BaseFactory.create(i + "").doAction();}

这时候就会报错了,当然了我们也可以进行空指针的判断,那么这样的代码也是可以的,不过不完美,不健壮,我们不可能所有的地方都要加上if(null)的判断,所以我们这样的设计模式就可以很好地解决这样的问题,还能很好地定位问题,运行代码可以看到输出内容如下:

05-29 16:00:16.712 1061-1061/com.example.jiaoben E/NullAdapter - lcs -: 警告!  对象为空!!!

05-29 16:00:16.712 1061-1061/com.example.jiaoben E/NullAdapter - lcs -: NullAdapter is doing something

05-29 16:00:16.712 1061-1061/com.example.jiaoben E/BaseAdapter - lcs -: 对象不为空!!!

05-29 16:00:16.712 1061-1061/com.example.jiaoben E/OneAdapter - lcs -: OneAdapter is doing something

05-29 16:00:16.712 1061-1061/com.example.jiaoben E/BaseAdapter - lcs -: 对象不为空!!!

05-29 16:00:16.712 1061-1061/com.example.jiaoben E/TwoAdapter - lcs -: TwoAdapter is doing something

很明显我们程序没有报错,我们也能够很清楚的看到我们的错误信息,这样即便是服务器出错误返回了我们客户端没有的类型,那么也不至于app会崩溃,也算是一种优雅的方式来解决这样的问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值