使用可选类减轻Java中的Null指针异常

空指针异常非常令人讨厌,因为每个Java开发人员都应该面对至少一次。 随着代码的增长,处理这些空指针异常将变得非常乏味,需要进行大量的空检查。

可选类已在Java 8中引入,以提供用于表示可选值而不使用空引用的类型级别的解决方案。 Java之前的版本8可选类是Google的Guava库的一部分。

让我们来看看一些实现java.util.Optional类

Creating an empty Object

可以通过调用创建空的Optional对象空的Optional类的静态方法。

@Test
public void createEmptyOptional() {
    Optional<String> empty = Optional.empty();
    assertFalse(empty.isPresent());//Also we can use the opposite one empty.isEmpty() from java 10
}

存在()仅当Optional中的对象不为null时,它将返回true;

Creating Optional class with objects

可选类可以用Optional.of()要么Optional.ofNullable()静态方法

@Test
public void createOptionalObject() {
    String title = "Optional";
    Optional<String> opt = Optional.ofNullable(title);
    assertTrue(opt.isPresent());

    String title2 = null;
    Optional<String> opt1 = Optional.ofNullable(title2);
    assertFalse(opt1.isPresent());
}

Optional.of(标题)如果标题为null,将抛出NullPointerException。

Remove null checks while accessing objects with Optional.ifPresent()

如果发现Optional中包装的Object不为null,它将使我们能够对包装的值运行一些代码。

public void checkOptionalIfPresent() {
    Color color = ColorFactoryProvider.getColor("red");
    Optional<Color> red = Optional.ofNullable(color);
    red.ifPresent(color -> System.out.println(color.getColorCode()));//wrapped code will get executed

    Color empty= null;
    Optional<Color> emptyColor = Optional.ofNullable(empty);
    emptyColor.ifPresent(color -> System.out.println(color.getColorCode()));// wrapped code will not get executed
}

您能看到Optional类如何使我们摆脱null检查,以便如果对象为null时包装的代码将不会执行?

Accessing the Objects from Optional class

Optional类也提供了各种方法。

/* 
Optional.get() 
It returns the wrapped object.
it throws a no such element exception if the wrapped object is null.
*/
@Test
public void getValue(){
  Color color = ColorFactoryProvider.getColor("blue");
  Optional<Color> optionalColor= Optional.ofNullable(color);
  assertEquals(color, optionalColor.get());
}

/*
Optional.orElse()
It is like assigning default value for the object. 
if the wrapped object is null then default value will be returned.
*/
@Test
public void OptionalorElseCheck(){
  Color defaultColor = ColorFactoryProvider.getColor("red");
  Color blue = ColorFactoryProvider.getColor("blue");
  Optional<Color> optionalColor = Optional.ofNullable(blue);
  assertEquals(blue, optionalColor.orElse(defaultColor));

  Color empty = null;
  Optional<Color> emptyColor = Optional.ofNullable(empty);
  assertEquals(defaultColor, emptyColor.orElse(defaultColor));
}

我们还有其他一些有用的方法 Optional.orElseGet()-类似于要不然()唯一的区别是它将供应商功能接口作为输入,并且仅当Optional中的包装对象为null时才调用。

Optional.orElseThrow()-类似于要不然()唯一的区别是它将Exception Object作为输入,并且如果Optional中的包装对象为null,它将抛出给定的异常。

因此,请使用Optional类开始重构代码,该类提供了处理Java中null的最佳实践。

For more detailed reference check the official documentation

from: https://dev.to//vikneswaran/mitigate-null-pointer-exceptions-in-java-with-optional-class-52od

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值