null值判断以及空指针异常应该是我们在代码中经常遇到的。针对null值的处理有两种:
(1)将null值替换为null对象(本质上,是利用多态)
(2)利用Java 8 的Optional对象
范例一:将null值替换为null对象(本质上,是利用多态)
/**
* @date 2017年7月13日
*/
public class Site {
private static class NullCustomer extends Customer {
@Override
public BillingPlan getPlan() {
return BillingPlan.basic();
}
@Override
public String getName() {
return "occupant";
}
@Override
public PaymentHistory getHistory() {
return PaymentHistory.newNull();
}
}
/**
* 顾客类
*
* @date 2017年7月13日
*/
private static class Customer {
private String _name;
private BillingPlan _plan;
private PaymentHistory _history;
public BillingPlan getPlan() {
return _plan;
}
public String getName() {
return _name;
}
public PaymentHistory getHistory() {
return _history;
}
static Customer newNull() {
return new NullCustomer();
}
}
/**
* 账单类
*
* @date 2017年7月13日
*/
private static class BillingPlan {
public static BillingPlan basic() {
return new BillingPlan();
}
}
/**
* 付款计划类
*
* @date 2017年7月13日
*/
private static class PaymentHistory {
private int _weeksDelinquentInLastYear;
public int getWeeksDelinquentInLastYear() {
return _weeksDelinquentInLastYear;
}
static NullPaymentHistory newNull() {
return new NullPaymentHistory();
}
}
private static class NullPaymentHistory extends PaymentHistory {
@Override
public int getWeeksDelinquentInLastYear() {
return 0;
}
}
private Customer _customer;
Customer getCustomer() {
return _customer == null ? Customer.newNull() : _customer;
}
/**
* 业务代码
*
* @date 2017年7月13日
*/
public static void doSomething() {
Site site = new Site();
Customer customer = site.getCustomer();
BillingPlan plan = customer.getPlan();
//代码某处用到
String customerName = customer.getName();
//代码某处用到
int weeksDelingquent = customer.getHistory().getWeeksDelinquentInLastYear();
System.err.println(customerName);
System.err.println(weeksDelingquent);
}
public static void main(String[] args) {
doSomething();
}
}
范例二:利用Java 8 的Optional对象
import java.util.Optional;
/**
* @date 2017年7月13日
*/
public class OptionalSite {
/**
* 顾客类
*
* @date 2017年7月13日
*/
private static class Customer {
private String _name;
private BillingPlan _plan;
private PaymentHistory _history;
public Optional<BillingPlan> getPlan() {
return Optional.ofNullable(_plan);
}
public String getName() {
return _name;
}
public Optional<PaymentHistory> getHistory() {
return Optional.ofNullable(_history);
}
}
/**
* 账单类
*
* @date 2017年7月13日
*/
private static class BillingPlan {
public static BillingPlan basic() {
return new BillingPlan();
}
}
/**
* 付款计划类
*
* @date 2017年7月13日
*/
private static class PaymentHistory {
private int _weeksDelinquentInLastYear;
public int getWeeksDelinquentInLastYear() {
return _weeksDelinquentInLastYear;
}
}
private Customer _customer;
Optional<Customer> getCustomer() {
return Optional.ofNullable(_customer);
}
/**
* 业务代码
*
* @date 2017年7月13日
*/
public static void doSomething() {
OptionalSite site = new OptionalSite();
Optional<Customer> customer = site.getCustomer();
BillingPlan plan = customer.flatMap(c -> c.getPlan()).orElse(BillingPlan.basic());
String customerName = customer.map(c -> c.getName()).orElse("occupant");
int weeksDelingquent = customer.flatMap(c -> c.getHistory()).map(h -> h.getWeeksDelinquentInLastYear()).orElse(0);
System.err.println(customerName);
System.err.println(weeksDelingquent);
}
public static void main(String[] args) {
doSomething();
}
}
网友评论