美文网首页
Java中如何避免麻烦的null值判断(转载)

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

作者: 不将就51y | 来源:发表于2018-03-02 16:07 被阅读0次

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值判断

相关文章

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

    null值判断以及空指针异常应该是我们在代码中经常遇到的。针对null值的处理有两种: (1)将null值替换为n...

  • Java中空值或者null的判断

    Java中空值或者null的判断 Java中总是有空值或者null的情况,但是Java和js是不一样的,js中可以...

  • 学习Optional 类

    1.介绍 Optional类是Java8为了解决null值判断问题,,使用Optional类可以避免显式的null...

  • 在 Java 8 中避免 Null 检查

    在 Java 8 中避免 Null 检查 原文:Avoid Null Checks in Java 8 译者:os...

  • null和空字符串('')的区别

    在Java开发中,我们需要常常判断是否值为null,尤其在xml数据交互过程中,我们判断某一个报文的值是否为nul...

  • 数据库优化

    一.sql语句优化 1.应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但...

  • String值判断

    判断String等于某值,比如 空("") 判断不等于某值(排除null,即 除null的其他值) 判断不等于某值...

  • Java null 强制类型转换

    Java中的null值是可以强制转换为任何Java类型的,就像(Object)null是合法的,但null强转后的...

  • Java Optional 对Null的友好

    Java Optional 对Null的友好 以前的做法 开发过程中,经常会有null的判断,会写很多if判断,导...

  • solidity智能合约如何判断mapping值为空

    mapping值的判断问题 在Java这类编程语言中,我们可以获得Map里面的值然后与null或空来进行判断该ke...

网友评论

      本文标题:Java中如何避免麻烦的null值判断(转载)

      本文链接:https://www.haomeiwen.com/subject/movaxftx.html