參數要檢查 not null 有幾個做法:
- Java 1.4 的 Assertions
- Java 7 的 Objects#requireNonNull()
- Java 8 的 Optional#of()
- Lombok 的 @NonNull
void assert4(Object o) { assert o != null; // Exception in thread "main" java.lang.AssertionError assert o != null : "o is null"; // Exception in thread "main" java.lang.AssertionError: o is null }
但是 JVM 預設關閉,所以要記得帶參數 -enableassertions。
void java7(Object o) { Objects.requireNonNull(o); // Exception in thread "main" java.lang.NullPointerException // at java.util.Objects.requireNonNull(Objects.java) Objects.requireNonNull(o, "o is null"); // Exception in thread "main" java.lang.NullPointerException: o is null // at java.util.Objects.requireNonNull(Objects.java) }
void java8(Object o) { Optional.of(o); // Exception in thread "main" java.lang.NullPointerException // at java.util.Objects.requireNonNull(Objects.java) // at java.util.Optional.(Optional.java) // at java.util.Optional.of(Optional.java) }
但是這不直覺。
void lombok(@lombok.NonNull Object o) { // Exception in thread "main" java.lang.NullPointerException: o is marked @NonNull but is null }
個人偏好:Lombok > Java Assertions > Objects#requireNonNull() > Optional#of()
實務上:Lombok = Objects#requireNonNull() > Optional#of() > Java Assertions
參考資料: