Java空指向处理:Optional工具类
- 编程
- 2023-01-22
在Java引用数据类型操作中null是一个重要的标记,同时由于null的存在也会带来NullPointerException异常,本课程主要讲解如何利用Optional类实现Java编程中null数据的处理
在整个引用数据类型的处理过程之中,一旦处理不当,就会在程序运行的时候出现有一个“NullPointerExceptioni”,而这种问题一旦出现就需要进行各种代码的排查。
范例:观察如下程序之中的问题
package
com.yootk.demo;
interface IMessage { // 定义一个接口public voidsend(String msg) ;
}
classFactory {
privateFactory() {} ;
public staticIMessage getInstance() {
return null; // 假设没有返回}
}
public class YootkDemo { // 李兴华编程训练营:yootk
public static void main(String[] args) throws Exception { IMessage messageObject = Factory.getInstance() ; // 通过工厂获取IMessage接口对象messageObject.send("沐言优拓"); // 进行数据的发送}
}此时的程序在运行的时候出现了一个NullPointerException,随后就需要根据异常出现的位置进行错误的排查,而且由于Factory.getInstance()方法可能有返回null的情况出现,那么此时能够解决这种空指向问题的关键就是追加一个判断语句。
范例:通过判断解决当前的异常
package
com.yootk.demo;
interface IMessage { // 定义一个接口public voidsend(String msg) ;
}
classFactory {
privateFactory() {} ;
public staticIMessage getInstance() {
return null ; // 假设没有返回}
}
public class YootkDemo { // 李兴华编程训练营:yootk
public static void main(String[] args) throws Exception { IMessage messageObject = Factory.getInstance() ; // 通过工厂获取IMessage接口对象if (messageObject != null) {
messageObject.send( "沐言优拓"); // 进行数据的发送}
}
}现在的程序解决空指向问题的核心依据在于:在客户端的主方法上使用了一个if判断语句来判断当前的返回对象是否为空,如果不为null,则执行接口方法调用,如果为空则不进行调用,但是如果说此时的Factory.getInstance()方法确定永远不会返回null,这个时候就可以减少客户端调用的这种无效的判断。
现在如果要想解决当前的问题就必须在返回方法中有一个明确的声明:经过本方法处理的操作是否可以返回null,如果可以返回null方法按照原始的方式编写,而如果确定不能够返回null的方法使用Optional进行描述。Optional是在JDK 1.8之后提供的一个新的系统类,这个类可以保证存储的数据不为null,首先来观察一下本类的使用。
范例:观察Optional保存空的问题
public class YootkDemo { // 李兴华编程训练营:
yootk
public static void main(String[] args) throws Exception { Optional<String> optional = Optional.of("沐言优拓") ; // 字符串绝对不为null
if (optional.isPresent()) { // 有数据保存String value = optional.get() ; // 从里面获取数据System.out.println(value);
}
}
}此时程序代码由于在Optional对象里面保存的内容属于非空的数据,所以可以正常完成,但是如果此时要是保存有null,则在保存的时候就会直接抛出异常。
范例:观察Optional保存null的问题
public class YootkDemo { // 李兴华编程训练营:
yootk
public static void main(String[] args) throws Exception { Optional<String> optional = Optional.of(null) ;
}
}由于Optional.of()方法不允许设置空数据,所以一旦使用之后就会出现空指向,通过当前的这种操作就可以得出一个结论:正常的设计结构,如果发现返回的是Optional类型,则一般都不会为空,因为一旦有空方法本身就有错误了,而不是调用处出错,那么就可以通过Optional来实现之前工厂类的修改。
范例:通过Optional改进工厂类
package
com.yootk.demo;
importjava.util.Optional;
@FunctionalInterface
interface IMessage { // 定义一个接口public voidsend(String msg) ;
}
classFactory {
privateFactory() {} ;
public staticOptional
+ msg);
}) ; // 假设没有返回}
}
public class YootkDemo { // 李兴华编程训练营:yootk
public static void main(String[] args) throws Exception { IMessage messageObject = Factory.getInstance().get() ; // 可以保证返回的内容不为空messageObject.send("沐言优拓:yootk");
}
}在以后随着开发的深入,尤其是在接触到一些系统类库的时候,经常会发现Optional类作为返回值类型,那么此时就可以大胆推测,这个方法的返回数据不为null。