java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了。为了防止抛出这个异常,我们经常会写出这样的代码:
Person person = people.find("John Smith"); if (person != null) { person.doSomething(); }
在Java世界里,解决空引用问题常见的一种办法是,使用Null Object模式。这样的话,在“没有什么”的情况下,就返回Null Object,客户端代码就不用判断是否为空了。但是,这种做法也有一些问题。首先,我们肯定要为Null Object编写代码,而且,如果我们想大规模应用这个模式,我们要为几乎每个类编写Null Object。
幸好,我们还有另外一种选择:Optional。Optional是对可以为空的对象进行的封装,它实现起来并不复杂。在某些语言里,比如 Scala,Optional实现成了语言的一部分。而对于Java程序员而言,Guava为我们提供了Optional的支持。闲言少叙,先来如何使用 Optional,完成前面的那段代码
Optional person = people.find("John Smith"); if (person.isPresent()) { person.get().doSomething(); }
这里如果isPresent()返回false,说明这是个空对象,否则,我们就可以把其中的内容取出来做自己想做的操作了。
如果你期待的是代码量的减少,恐怕这里要让你失望了。单从代码量上来说,Optional甚至比原来的代码还多。但好处在于,你绝对不会忘记判空,因为这里我们得到的不是Person类的对象,而是Optional。
看完了客户端代码,我们再来看看怎样创建一个Optional对象,基本的规则很简单:
如果我们知道自己要封装的对象是一个空对象,可以用
Optional.absent();
如果封装的对象是一个非空对象,则可以用
Optional.of(obj);
如果不知道对象是否为空,就这样创建创建
Optional.fromNullable(obj);
有时候,当一个对象为null的时候,我们并不是简单的忽略,而是给出一个缺省值,比如找不到这个人,任务就交给经理来做。使用Optional可以很容易地做到这一点,以上面的代码为例:
Optional person = people.find("John Smith"); person.or(manager).doSomething()
说白了,Optinal是给了我们一个更有意义的“空”。
简单使用实例:
Student student = new Student(); String name = student.getName(); Optional<String> optional = Optional.fromNullable(name); if (optional.isPresent()) { System.out.println("name : " + name); }else { System.out.println("null ........"); student.setName("sungang"); } name = student.getName(); optional = Optional.fromNullable(name); if (optional.isPresent()) { System.out.println("name : " + name); }else { System.out.println("null ........"); student.setName("sungang"); }
结果:
null ........ name : sungang
相关推荐
- **错误处理**: 引入了`Optional`类,帮助开发者更好地处理null值问题,减少空指针异常的发生。 总的来说,Guava库是Java开发者的强大工具,它提供的各种工具和类库能帮助开发者编写更高效、更健壮的代码。无论是...
- `Optional` 类是一个容器对象,可能包含或不包含非null值。如果值存在则 `isPresent()` 返回 true,调用 `get()` 返回该值。这样可以避免空指针异常,提高代码的健壮性。 ```java Optional<String> optionalName...
Google Guava是一个由Google开发并维护的开源Java库,它为Java开发者提供了许多实用的工具类和集合框架,极大地简化了常见的编程任务。这个框架包含了多个模块,如基础(base)、缓存(cache)、I/O(io)以及并发...
Guava的Optional类是Java 8 Optional的前身,用于表示可能为null的值,避免空指针异常。例如: ```java Optional<String> optional = Optional.ofNullable(getValue()); if (optional.isPresent()) { System....
在Java 8之前,Guava的Optional类已经提供了防止null值引起的异常的良好解决方案,强制开发者明确处理可能的缺失值。 通过研究"guava-master.zip"中的源代码,我们可以了解Guava库的实现原理,学习Google在编程...
4. **Optional类**:Guava的Optional类用于表示可能存在也可能不存在的值,避免了null值带来的问题。它鼓励开发者更明确地表达代码逻辑,降低了空指针异常的风险。 5. **预加载(Predicates)** 和 **函数式编程**:...
通过返回`Optional`对象而不是null,API消费者可以更好地理解方法可能的行为,而无需查看具体的实现细节。 总的来说,虽然Java 8之前的版本没有内置的`Optional`类,但通过自定义实现或使用第三方库,我们可以在旧...
比如,Guava的`Optional<T>`类可以用来表示一个值可能存在也可能不存在,避免了传统的null值可能导致的空指针异常。`Optional`提供了`of(T t)`、`empty()`和`ofNullable(T t)`等方法来创建实例。 总结来说,Java 8...
5. **Optional**:也是自Java 8引入的一个工具类,用于避免空指针异常,通过Optional对象可以更好地表达null值的存在与否,提高了代码的健壮性。 6. **Collections**:`java.util.Collections`类提供了对集合进行...
19. **避免空对象检查**: 使用Optional类可以避免空指针异常,同时减少显式null检查。 20. **利用Java 8特性**: Lambda表达式、流API等新特性可以写出更简洁高效的代码。 21. **合理使用枚举**: 枚举类型比使用...
5. **避免空对象检查**:如果可能,使用Optional类来封装可能为null的对象,减少显式的null检查。 6. **使用equals()与hashCode()的约定**:当重写equals()时,确保同时重写hashCode(),以保持散列码的一致性。 7....
自Java 8引入,Optional用于避免空指针异常,它可以更清晰地表达代码逻辑,减少null值处理的困扰。 10. **Stream API**: Java 8引入的Stream API,提供了一种新的处理数据的方式,可以进行聚合操作、过滤、映射...
此外,Java 8引入了`Optional`类,它用于表示可能为null的值,有助于避免空指针异常。在处理数据集时,尤其是在进行null检查时,`Optional`可以提高代码的可读性和安全性。 对于需要持久化存储的数据集,Java提供了...
19. 避免空对象检查:使用`Optional`类可以更优雅地处理空值,避免显式的`null`检查。 20. 利用Java的编译器优化:Java HotSpot虚拟机会自动进行许多优化,如逃逸分析、标量替换等。 21. 适当使用多线程:根据任务...