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);
    }
}

// ----- Interfaces -----
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 {}

// ----- Top-Level Records (implementing PaymentMethod) -----
record CreditCardPayment(CreditCard card) implements PaymentMethod {}
record BankTransferPayment(BankTransfer transfer) implements PaymentMethod {}
record CryptoPayment(Crypto crypto) implements PaymentMethod {}

// ----- Nested Record Types -----
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 {}
Share