Language
sealed class: 許可した型だけを網羅的にswitchできる
sealed型の許可サブタイプを全て扱うswitchは、defaultなしで分岐の網羅性を表せます。
SourceSealedSwitches.java
Java 21
package examples.language;
public final class SealedSwitches {
private SealedSwitches() {}
public static String describe(Payment payment) {
return switch (payment) {
case Card card -> "card:" + card.lastFour();
case BankTransfer transfer -> "bank:" + transfer.reference();
};
}
public sealed interface Payment permits Card, BankTransfer {}
public record Card(String lastFour) implements Payment {}
public record BankTransfer(String reference) implements Payment {}
}TestSealedSwitchesTest.java
Java 21
package examples.language;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class SealedSwitchesTest {
@Test
void sealed型の全許可サブタイプをswitchで分岐できる() {
assertEquals("card:1234", SealedSwitches.describe(new SealedSwitches.Card("1234")));
assertEquals("bank:tx-42", SealedSwitches.describe(new SealedSwitches.BankTransfer("tx-42")));
}
}01Assertion
このテストで確認できること
- CardとBankTransferの許可サブタイプをswitchで処理できる
- defaultなしで全ケースを記述できる
取り得る状態が閉じているドメインではsealed型を使うと、型の追加時にswitch漏れをコンパイル時に検知できます。
OBSERVED RESULT
expected: Card → card:1234
actual: card:1234
expected: BankTransfer → bank:tx-42
actual: bank:tx-42