Οι sealed classes, δεν είναι διαροφές (λέξη-κλειδί:enum).
Έρχοντας από τη Java, θα μπορούσατε να σας πειράξετε να υπερφορτίσετε την απαρίθμησή σας των συνεισφορών λειτουργιών: // Κώδικας Java

enum PizzaOrderStatus {
    ORDER_RECEIVED,
    PIZZA_BEING_MADE,
    OUT_FOR_DELIVERY,
    COMPLETED;
    public PizzaOrderStatus nextStatus() {
        switch (this) {
        case ORDER_RECEIVED: return PIZZA_BEING_MADE;
        case PIZZA_BEING_MADE: return OUT_FOR_DELIVERY;
        case OUT_FOR_DELIVERY: return COMPLETED;
        case COMPLETED:return COMPLETED;
        }
    }
}

Αντ' αυτού, μπορείτε να χρησιμοποιήσετε την κλειστή κλάση:

sealed class PizzaOrderStatus(protected val orderId: Int) {
    abstract fun nextStatus() : PizzaOrderStatus
    class OrderReceived(orderId: Int) : PizzaOrderStatus(orderId) {
        override fun nextStatus(): PizzaOrderStatus {
            return PizzaBeingMade(orderId)
        }
    }
    class PizzaBeingMade(orderId: Int) : PizzaOrderStatus(orderId) {
        override fun nextStatus(): PizzaOrderStatus {
            return OutForDelivery(orderId)
        }
    }
    class OutForDelivery(orderId: Int) : PizzaOrderStatus(orderId) {
        override fun nextStatus(): PizzaOrderStatus {
            return Completed(orderId)
        }
    }
    class Completed(orderId: Int) : PizzaOrderStatus(orderId) {
        override fun nextStatus(): PizzaOrderStatus {
            return this
        }
    }
}

Το πλεονέκτημα αυτής της προσέγγισης είναι ότι τώρα μπορούμε να μεταφέρουμε δεδομένα με το Κατάσταση:

var status: PizzaOrderStatus = OrderReceived(123)
while (status !is Completed) {
    status = when (status) {
        is OrderReceived -> status.nextStatus()
        is PizzaBeingMade -> status.nextStatus()
        is OutForDelivery -> status.nextStatus()
        is Completed -> status
    }
}

Συνήθως, οι κλειστές κλάσεις είναι καλές αν θέλετε να έχετε δεδομένα που είναι συνδεδεμένα με ένα Κράτος.

Σχετικά άρθρα