一、问题引入
在我们日常的编码过程中,我们经常会写出类似如下代码
Object object = map.get(index);
if(object != null){
//调用test方法
object.test()
}
从上面的代码我们可以看到,我们获取到一个object对象时,需要先对它进行空判断,然后在对object对象进行操作,如果不尽兴判空操作,直接对object对象,有可能会报空指针异常。
二、问题解决
为了解决上面的问题,假如我们客户端不想做判空操作。我们是否可以要求map在获取不到对象的数据,不返回null对象给我们,而是返回一个无用的空对象类,仅仅是用来告诉我们从map中找不到数据。而这种解决办法就是空对象设计模式的思想
三、定义
创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
四、模式解读
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。
五、代码案例
我们就用现实生活中买车的情况来编写这个案例,车店里有宝马,沃尔沃的车,但是没有特斯拉的新能源车,小明去买车,当他买前面两种车时,直接提车,买特斯拉则被提醒没有店里没有特斯拉。
package nullObject;
/**
* @Package: nullObject
* @ClassName: Car
* @Author: tanp
* @Description: 抽象类
* @Date: 2020/11/20 17:42
*/
public abstract class Car {
public abstract String getName();
}
package nullObject;
/**
* @Package: nullObject
* @ClassName: NullCar
* @Author: tanp
* @Description: 模拟不做任何实现的空对象类
* @Date: 2020/11/20 17:53
*/
public class NullCar extends Car {
@Override
public String getName(){
return "没有这一款车";
}
}
package nullObject;
/**
* @Package: nullObject
* @ClassName: WoErWo
* @Author: tanp
* @Description: 模拟扩展抽象类的实体类,沃尔沃汽车
* @Date: 2020/11/20 17:50
*/
public class WoErWo extends Car {
private String name;
public WoErWo(String name) {
this.name = name;
}
@Override
public String getName(){
return this.name;
}
}
package nullObject;
/**
* @Package: nullObject
* @ClassName: BaoMa
* @Author: tanp
* @Description: 模拟扩展抽象类的实体类,宝马汽车
* @Date: 2020/11/20 17:46
*/
public class BaoMa extends Car {
private String name;
public BaoMa(String name) {
this.name = name;
}
@Override
public String getName(){
return this.name;
}
}
package nullObject;
/**
* @Package: nullObject
* @ClassName: CarShop
* @Author: tanp
* @Description: 车店
* @Date: 2020/11/20 18:00
*/
public class CarShop {
public static Car getCar(String name) {
if (name.equals("BaoMa")) {
return new BaoMa(name);
}
if (name.equals("WoErWo")) {
return new WoErWo(name);
}
return new NullCar();
}
}
package nullObject;
/**
* @Package: nullObject
* @ClassName: DemoClient
* @Author: tanp
* @Description: ${description}
* @Date: 2020/11/20 18:04
*/
public class DemoClient {
public static void main(String[] args) {
Car baoma = CarShop.getCar("BaoMa");
System.out.println(baoma.getName());
Car woerwo = CarShop.getCar("WoErWo");
System.out.println(woerwo.getName());
Car telasi = CarShop.getCar("tesila");
System.out.println(telasi.getName());
}
}
结果