Java中如何避免麻烦的null值判断(转载)

2018-03-02  本文已影响0人  不将就51y

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();
    }
}

Java中如何避免麻烦的null值判断

上一篇 下一篇

猜你喜欢

热点阅读