Introduce Null Object(引入Null 对象)

本文介绍如何在Java代码中避免null值检查,通过实现Nullable接口和创建空对象Singleton,重构Site、Customer和PaymentHistory类,减少冗余的null判断,提高代码简洁性和可读性。
摘要由CSDN通过智能技术生成

一而再,再而三地检查对象是否null

public class Site {
	private Customer customer;
	
	public Customer getCustomer() {
		return customer;
	}
}


public class Customer {
	
	private String name;
	
	private BillingPlan plan;
	
	private PaymentHistory history;

	public String getName() {
		return name;
	}
	
	public String getPlan() {
		return plan;
	}
	
	public String getHistory() {
		return history;
	}
}

public class PaymentHistory {
	
	private Integer weeksDelingquent;
	
	public int getWeeksDelingquentInLastYear() {
		return weeksDelingquentInLastYear;
	}
}


Customer customer = site.getCustomer();
BillingPlan plan;
if (customer == null) {
	plan = BillingPlan.basic();
} else {
	plan = customer.getPlan();
}
//...
String customerName;
if (customer == null) {
	customerName = "occupant";
} else {
	customerName = customer.getName();
}
//...
int weeksDelingquent;
if (customer == null) {
	weeksDelingquent = 0;
} else {
	weeksDelingquent = customer.getHistory().getWeeksDelingquentInLastYear();
}

重构:将null值替换为null对象

注意:空对象一定是常量,它们的任何成分都不会发生变化。因此可以使用Singleton 模式实现。

public interface Nullable {
	public boolean isNull();
}


public class Site {
	private Customer customer;
	
	public Customer getCustomer() {
		return customer == null ? Customer.newNull() : customer;
	}
}


public class Customer implements Nullable {
	
	private String name;
	
	private BillingPlan plan;
	
	private PaymentHistory history;

	public boolean isNull() {
		return false;
	}
	
	public static Customer newNull() {
		return new NullCustomer();
	}
	
	public String getName() {
		return name;
	}
	
	public String getPlan() {
		return plan;
	}
	
	public void setPlan(BillingPlan plan) {
		this.plan = plan;
	}
	
	public String getHistory() {
		return history;
	}
}

public class PaymentHistory implements Nullable {
	
	private Integer weeksDelingquent;
	
	public boolean isNull() {
		return false;
	}
	
	public int getWeeksDelingquentInLastYear() {
		return weeksDelingquentInLastYear;
	}
	
	public static PaymentHistory newNull() {
		return new NullPaymentHistory();
	}
}


public class NullCustomer extends Customer {
	
	public boolean isNull() {
		return true;
	}
	
	public String getName() {
		return "occupant";
	}
	
	public String getPlan() {
		return BillingPlan.basic();
	}
	
	public String getHistory() {
		return PaymentHistory.newNull();
	}
	
}

public class NullPaymentHistory extends PaymentHistory {

	public boolean isNull() {
		return true;
	}
	
	public int getWeeksDelingquentInLastYear() {
		return 0;
	}
	
}



Customer customer = site.getCustomer();
BillingPlan plan = customer.getPlan();
//...
String customerName = customer.getName();
//...
int weeksDelingquent = customer.getHistory().getWeeksDelingquentInLastYear();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值