基本的工具(更愉快的使用JAVA语言)
使用和避免null
个人博客
http://www.taociabc.com/wordpress/2018/01/06/guava%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E7%B3%BB%E5%88%97-%E4%BD%BF%E7%94%A8%E5%92%8C%E9%81%BF%E5%85%8Dnull/
详细的英文原文:https://github.com/google/guava/wiki/UsingAndAvoidingNullExplained
null在java中很常见,对象初始化为null,对象数组元素null。但是在大多数时候 null 出现在我们的应用程序代码中时,会导致人们困惑,甚至致命的异常。
原文中例举的:Map.get(key) 可以返回null,这里就存在歧义,或者说不那么一目了然,这里返回的null究竟是表示值不存在,还是值存在,但它就是null值呢?因此在google guava的许多工具集中,被设计为如果出现 null 则快速故障报警fail fast的方式,而不被设计为允许 null 出现。
Map map = new HashMap();
map.put("b",null);
System.out.println(map.get("a"));
System.out.println(map.get("b"));
当然,null在表示成功或正确的事情时是廉价的,从内存和速度方面来说。因此guava提供了许多方式让你在必须使用null的情况下更简单,而在不必使用null时,尽量避免null。
具体的情形
不建议在set和map中使用null,更清晰的方式是你在查找操作时显示的认定某个值是null。
如果你想在map中放入null值,忘记这个方案吧,可替代的方式是用set存放你的所有是null值的key或非null值的key。map中放值为null是一个令人困惑的行为,最好将这类key单独存放,并且你可以考虑一下为何你的应用中会让key关联上一个null值。
如果你正在list中使用null值 -- 如果这个list是稀疏的,你是否可以考虑Map<Integer,E>来替代?这可能更高效,并且更加贴合你要实现的应用场景。
考虑一下是否有很自然的场景要必须用null对象,并不总是吧。比如,有时一个枚举,我们可以通过添加一个枚举值,用它来表示一些你想表达null的地方。例如 java.math.RoundingMode有一个UNNECESSARY的值来指示“什么也不做,并且抛出异常,当必须四舍五入时”。
当你的确认为需要使用null时,并且使用对null不友好的collection实现有困难时,用一个不一样的实现吧,比如 Collections.unmodifiableList(Lists.newArrayList()) 代替 ImmutableList
Optional
很多情形下编程人员使用null是为了指示某种缺失,也许那可能有一个值、那什么也没有、或可能找不到值。比如Map.get返回null是在找不到key对应的值时。
Optional<T>是一种使用非空引用替换可能为空的T引用的方式,一个Optional可能包含一个非空T引用(这种情形我们称引用存在),或它可能什么也不包含(这种情形我们称引用缺失)。但永远不称它为“contain null”
Optional possible=Optional.of(5);
possible.isPresent();//returns true
possible.get();//returns 5
optional并不打算和其它已经存在的option或可能来自其它语言环境的实现相类似,虽然它可能会有些相像。
构造一个Optional
以下每一个都是Optional中的静态方法
MethodDescription
Optional.of(T)Make an Optional containing the given non-null value, or fail fast on null.
Optional.absent()Return an absent Optional of some type.
Optional.fromNullable(T)Turn the given possibly-null reference into an Optional, treating non-null as present and null as absent.