使用场景:你需要再三检查某对象是否为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);
}
}