Εκπαίδευση - kotlin: enum, sealed classes
Publié le 17 May 2022
Οι 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
}
}
Συνήθως, οι κλειστές κλάσεις είναι καλές αν θέλετε να έχετε δεδομένα που είναι συνδεδεμένα με ένα Κράτος.