Introduce Null Object (引入Null对象)

使用场景:你需要再三检查某对象是否为null
使用方法:将null值替换为null对象
案例一

package 第九章;

public class Customer  {
	private String name;
	private BillingPlan billPlan;
	private PaymentHistory paymentHistory;
	//步骤一:源类中添加isNull()函数
	public boolean isNull() {
		return false;
	}

	static Customer newNull() {
		return new NullCustomer();
	}

	public String getName() {
		return name;
	}

	public BillingPlan getPlan() {
		return billPlan;
	}

	public PaymentHistory getHistory() {
		return paymentHistory;
	}

	class BillingPlan {

	}

	class PaymentHistory {
		int getWeekDelinquentInLastYear;
	}

}
public class NullCustomer extends Customer {
 	//步骤二:子类中添加isNull()方法
	public boolean isNull() {
		// TODO Auto-generated method stub
		return true;
	}
	
}
package 第九章;

public class Site {
	Customer _customer;
	//步骤三:在获取customer做判断的地方,根据判断是否返回Null对象
	public Customer getCustomer(){
		return (_customer == null)?  Customer.newNull():_customer;
	}
public class Test {
	public static void main(String[] args) {
		Site site = new Site();
		System.out.println(site.getCustomer().isNull());
	}
}

这里isNull()函数的添加,可以采用直接添加,也可以采用接口的方式,接口更加直观。

接口的方式:

interface Nullable{
	void isNull();
}
public class Customer  implements Nullable{
...省略
	@Override
	public boolean isNull() {
		// TODO Auto-generated method stub
		return false;
	}
...省略
}
public class NullCustomer extends Customer {
	@Override
	public boolean isNull() {
		// TODO Auto-generated method stub
		return true;
	}
}

拓展一: 对象判空后,通常需要对空对象做出响应,所以响应的内容,也可以直接写到空对象中去。

代码解释:

package 第九章;

public class Test {
	public static void main(String[] args) {
		String customerName;
		Site site = new Site();
		Customer customer = site.getCustomer();
		//对空进行响应
		if(customer.isNull()){
			customerName = "occupant";
		}else{
			customerName = customer.getName();
		}
	}
}

拓展做法:

package 第九章;

public class NullCustomer extends Customer {
	 @Override
	public boolean isNull() {
		// TODO Auto-generated method stub
		return true;
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "occupant";
	}
}
package 第九章;

public class Test {
	public static void main(String[] args) {
		String customerName;
		Site site = new Site();
		Customer customer = site.getCustomer();
		//此处无需进行判空的特别处理
		customerName = customer.getName();
		System.out.println("curstomerName: "+customerName);
	}
}

但此处值得注意:客户端需要对空对象做出相同的响应时,可以这样处理,但如果是不同的响应,仍需按照上面重新判空分别做处理。
拓展二: 获取对象的对象时,空对象也需要配合的创建该对象的空对象。
代码解释

package 第九章;

public class Test {
	public static void main(String[] args) {
		Site site = new Site();
		Customer customer = site.getCustomer();
		//如果此时customer 为空,则getHistory()则需要在空对象中进行添加空的对象
		int delinquent = customer.getHistory().getWeekDelinquentInLastYear;
		System.out.println("curstomerName: "+delinquent);
	}
}
package 第九章;

public class PaymentHistory {
	int getWeekDelinquentInLastYear;

	public int getGetWeekDelinquentInLastYear() {
		return getWeekDelinquentInLastYear;
	}
	public static PaymentHistory newNull(){
		return new NullPaymentHistory();
	}
	 
}

package 第九章;

public class NullPaymentHistory extends PaymentHistory {
	public int getGetWeekDelinquentInLastYear() {
		// TODO Auto-generated method stub
		return 0;
	}
}

package 第九章;

public class NullCustomer extends Customer {
	 @Override
	public boolean isNull() {
		// TODO Auto-generated method stub
		return true;
	}
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "occupant";
	}
	 //此处则新增空的PaymentHistory对象进行处理
	@Override
	public PaymentHistory getHistory() {
		// TODO Auto-generated method stub
		return PaymentHistory.newNull();
	}
}

案例二:如果无法修改源类,则使用接口的方式

package 第九章;
//只需要新建一个Null接口,不需要定义任何函数
public interface Null {

}
package 第九章;

public class NullCustomer extends Customer implements Null {
	 
}

package 第九章;

public class Site {
	Customer _customer;
	public Customer getCustomer(){
	//此处返回空对象的方式修改了
		return (_customer == null)?  new NullCustomer():_customer;
	}
	}
Customer.class 不变
public class Test {
	public static void main(String[] args) {
		Site site = new Site();
		System.out.println(site.getCustomer() instanceof Null);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值