Using and avoiding null翻译

来源:互联网 发布:plc触摸屏怎样编程 编辑:程序博客网 时间:2024/06/02 04:14
一。Optional
大多数情况下使用null是为了表示不存在的意思,也许应该有一个value,但是这个value是空或者这个value找不到。比如,value,Map.get返回null表示没有该map中没有这个key的值。
optional<T>是一种用非空值替换数据类型T的方法。一个Optional对象可以包含一个非空的T引用(这种情况下我们称之为“present”)或者不包含任何东西(这种情况下我们称之为“absent”)。但Optional从来不会包含对null值的引用。


Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5


Optional是一个抽象类,实现Serializable接口,有两个实现类Present和Absent类
1.静态方法:
Optional.of(T):返回一个不为空的present<T>实例,否则抛一个NullPointerException异常
Optional.absent():返回一个absent的实例
Optional.fromNullable(T):T可以为空,根据T是否为空返回一个present或absent的实例
2.实例方法:
abstract boolean isPresent():判断T实例是否为null
abstract T get():返回Optional包含的T实例,该T实例必须不为空;否则,会抛出一个IllegalStateException异常
abstract T or(T):返回与T相同的实例,否则返回输入的T实例作为默认值
abstract T orNull():返回Optional实例中包含的非空T实例,如果Optional中包含的是空值,返回null
abstract Set<T> asSet():


Optional除了给null值命名所带来的代码可阅读性的提高,最大的好处莫过于Optional是傻瓜式的。Optional对象的使用强迫你去积极的思考这样一种情况,如果你想让你的程序返回null值,这null值代表的含义是什么,因为你想要取得返回值,必然从Optional对象内部去获得,所以你必然会这么去思考。但是只是简单的使用一个Null值会很轻易的让人忘记去思索代码所要表达的含义到底是什么,尽管FindBugs有些帮助,但是我们还是认为它并没有尽可能的解决好帮助程序员去思索null值代表的含义这个问题。












J2SE 提供的最后一个批注是 @SuppressWarnings。该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默。 


@SuppressWarnings 批注允许您选择性地取消特定代码段(即,类或方法)中的警告。其中的想法是当您看到警告时,您将调查它,如果您确定它不是问题,您就可以添加一个 @SuppressWarnings 批注,以使您不会再看到警告。虽然它听起来似乎会屏蔽潜在的错误,但实际上它将提高代码安全性,因为它将防止您对警告无动于衷 — 您看到的每一个警告都将值得注意。










二。Preconditions(final class)
Guava提供了大量的参数检验的工具类
每个方法都有三个变式:
*没有替他的参数
*一个额外的对象参数
*一个额外的String对象




Preconditions工具类:都是静态方法
*checkArgument(boolean):检查boolean是为true,用作方法中检查参数,抛IllegalArgumentException
*checkNotNull(T):检查value部位null,返回value,抛NullPointerException
*checkState(boolean):检查对象的某些状态,不依赖方法的参数,比如,Iterator在调用remove()之前要先调用next()检查是否还存在 数据的状态;抛IllegalStateException
*checkElementIndex(int index, int size):判断index的范围是是否合法0~size;抛IndexOutOfBoundsException
*checkPositionIndex(int index, int size):同上
*checkPositionIndexes(int start, int end, int size):检查[start, end)是一个长度为size的list, string或array合法的范围子集