「这是我参与2022首次更文挑战的第41天,活动详情查看:2022首次更文挑战」。
一、什么是空对象模式
在日常开发中,遇到对象可能为空时我们都需要进去空的判断。比如我从一个接口获取到了一个list对象(我无法看到这个接口的具体实现),使用list种每一个对像,我都需要进行空判断。如果我们事先约定不返回null,而是返回特殊的对象,这样我们就可以一定程度上避免空指针异常了。空对象模式:使用一个Null对象替代Null进行返回,定义一个抽象的父类,一个扩展类实现了该类的各种操作,以及一个可以以同样的方式使用的空对象,既可以避免空指针。
二、空对象模式的实现
public abstract class AbstractUser {
protected String name;
public abstract void show();
public abstract boolean isNull();
}
抽象用户对象
public class User extends AbstractUser {
public User(String name) {
this.name = name;
}
@Override
public void show() {
System.out.println("this user name:" + this.name);
}
@Override
public boolean isNull() {
return true;
}
}
具体的用户对象,此处为我们要使用的用户对象。
public class NullUser extends AbstractUser{
@Override
public void show() {
System.out.println("Null User is not available");
}
@Override
public boolean isNull() {
return false;
}
}
Null用户对象,这个对象反应的就是不做事情,用来代替直接返回null,避免空指针异常。
public static void main(String[] args) {
List<AbstractUser> list = new ArrayList<>();
list.add(new User("张三"));
list.add(new User("王五"));
list.add(new User("李四"));
list.add(new NullUser());
list.add(null);
for (AbstractUser user : list) {
System.out.println(user.isNull());
user.show();
}
}
在这个list种,我们添加了User对象,NullUser对象以及null,如果我们没有使用空对象模式,在没有对象的时候我们返回的就是null,如果直接调用null的方法,直接就会爆出空指针异常,就像此处的list的最后一个对象一样,但如果我们使用空对象代替空指针异常,就可以正常允许。
三、总结
空对象模式一般很少使用。空对象模式的角色:
- 抽象对象角色:如以User对象为例子,抽象User对象,包含User属性以及判断是否为空的方法。
- 具体对象角色:具体的对象。
- 空对象角色:抽象对象的实现,不过do-nothing,不做任何操作。