1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Main {
public static void main(String[] args) {
PaymentMethod method = new BankTransferPayment(new SEPA("DE89...", "COBADEFFXXX"));
describePayment(method);
}
public static void describePayment(PaymentMethod method) {
String result = switch (method) {
case CreditCardPayment(var card) -> switch (card) {
case Visa(var number) -> "Paid with Visa: " + number;
case MasterCard(var number) -> "Paid with MasterCard: " + number;
case Amex(var number) -> "Paid with Amex: " + number;
};
case BankTransferPayment(var transfer) -> switch (transfer) {
case SEPA(var iban, var bic) -> "Paid via SEPA. IBAN: " + iban + ", BIC: " + bic;
case SWIFT(var acc, var swift) -> "Paid via SWIFT. Account: " + acc + ", SWIFT: " + swift;
};
case CryptoPayment(var crypto) -> switch (crypto) {
case Bitcoin(var addr) -> "Paid with Bitcoin. Address: " + addr;
case Ethereum(var addr) -> "Paid with Ethereum. Address: " + addr;
case CustomCrypto(var name, var addr) -> "Paid with " + name + ". Address: " + addr;
};
};
System.out.println(result);
}
}
sealed interface PaymentMethod permits CreditCardPayment, BankTransferPayment, CryptoPayment {}
sealed interface CreditCard permits Visa, MasterCard, Amex {}
sealed interface BankTransfer permits SEPA, SWIFT {}
sealed interface Crypto permits Bitcoin, Ethereum, CustomCrypto {}
record CreditCardPayment(CreditCard card) implements PaymentMethod {}
record BankTransferPayment(BankTransfer transfer) implements PaymentMethod {}
record CryptoPayment(Crypto crypto) implements PaymentMethod {}
record Visa(String number) implements CreditCard {}
record MasterCard(String number) implements CreditCard {}
record Amex(String number) implements CreditCard {}
record SEPA(String iban, String bic) implements BankTransfer {}
record SWIFT(String account, String swiftCode) implements BankTransfer {}
record Bitcoin(String address) implements Crypto {}
record Ethereum(String address) implements Crypto {}
record CustomCrypto(String name, String address) implements Crypto {}
Edit
Share
✕