Functional
Optional: フィールドや引数にするとnullとemptyが二重になる
Optional型のフィールドや引数にもnullを渡せるため、不在の表現がnullとemptyの二つに増えます。
SourceOptionalApiDesign.java
Java 21
package examples.optional;
import java.util.Optional;
public final class OptionalApiDesign {
private OptionalApiDesign() {}
public static String displayFromOptionalArgument(Optional<String> nickname) {
return nickname.orElse("guest");
}
public static String displayFromNullableArgument(String nickname) {
return Optional.ofNullable(nickname).orElse("guest");
}
public record Profile(Optional<String> nickname) {
public String displayName() {
return nickname.orElse("guest");
}
}
}TestOptionalApiDesignTest.java
Java 21
package examples.optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.junit.jupiter.api.Test;
class OptionalApiDesignTest {
@Test
void Optional型の引数にもnullを渡せるため不在表現が二重になる() {
assertThrows(
NullPointerException.class, () -> OptionalApiDesign.displayFromOptionalArgument(null));
assertEquals("guest", OptionalApiDesign.displayFromNullableArgument(null));
}
@Test
void Optional型のフィールドにもnullを渡せるため利用時に失敗する() {
var profile = new OptionalApiDesign.Profile(null);
assertThrows(NullPointerException.class, profile::displayName);
}
}01Assertion
このテストで確認できること
- Optional型の引数にnullを渡すとorElseの呼び出しで失敗する
- Optional型のフィールドにもnullを渡せて利用時に失敗する
Optionalは主に戻り値で不在を表すための型です。引数やフィールドには通常の型と明示的なnull境界を使うと、状態を一つに保てます。
OBSERVED RESULT
expected exception: Optional argument null → NullPointerException
actual: NullPointerException
expected: nullable argument → guest
actual: guest