在函数的形参中使用 Optional 类型的参数的时候,编译的时候会被 Intellj IDEA/Android Studio 发出警告,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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")); } } |
警告信息如下:
1 |
'Optional<String>' used as type for parameter 'message' |
对于这个警告,初期是非常迷惑的,不清楚为什么 Optional 类型不能作为函数的形参。后来搜索了一下网络,加上自己理解,才豁然开朗。
其实 Optional 类型产生的本身是为了避免空指针异常而引入的,如果在函数的形参中使用 Optional 类型,那么如果传入的 Optional 类型的参数本身就是 null 的话,就会在使用 Optional 参数的时候抛出空指针异常了。因此干脆就希望不要在函数的行参中使用 Optional 类型。
通过测试,Intellj IDEA/Android Studio 对于函数返回值,是不发出这个警告的。
接口的话,可以使用类似下面的写法来规避这个警告:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 类型。