理解Intellj IDEA/Android Studio警告'Optional' used as type for parameter

在函数的形参中使用 Optional 类型的参数的时候,编译的时候会被 Intellj IDEA/Android Studio 发出警告,代码如下:

import java.util.Optional;

public class OptionalDemo {

    private static void printOptionalString(Optional<String> message) {
        System.out.println(message.orElse("empty"));
    }

    public static void main(String[] args) {
        printOptionalString(Optional.of("hello"));
    }

}

警告信息如下:

'Optional<String>' used as type for parameter 'message'

对于这个警告,初期是非常迷惑的,不清楚为什么 Optional 类型不能作为函数的形参。后来搜索了一下网络,加上自己理解,才豁然开朗。

其实 Optional 类型产生的本身是为了避免空指针异常而引入的,如果在函数的形参中使用 Optional 类型,那么如果传入的 Optional 类型的参数本身就是 null 的话,就会在使用 Optional 参数的时候抛出空指针异常了。因此干脆就希望不要在函数的行参中使用 Optional 类型。

通过测试,Intellj IDEA/Android Studio 对于函数返回值,是不发出这个警告的。

接口的话,可以使用类似下面的写法来规避这个警告:

import java.util.Optional;

public class OptionalDemo {
    
    public static void main(String[] args) {
        OptionalCallback<Optional<String>> cb = new OptionalCallback<Optional<String>>() {
            @Override
            public void onOptionalFired(Optional<String> message) {
                System.out.println(message.orElse("empty"));
            }
        };
        cb.onOptionalFired(Optional.of("hello"));
    }

    private interface  OptionalCallback<T> {
        void onOptionalFired(T message);
    }
}

虽然可以通过 @SuppressWarnings("OptionalUsedAsFieldOrParameterType") 来禁止这个警告的发出,但是还是建议遵守这个警告,尽量不要在函数的形参中使用 Optional 类型。

参考链接