Ну?Как насчет этого кода?
enum class PaymentMethodType(val type: String) {
PAYPAL("Paypal"),
VISA("Visa"),
MASTERCARD("MasterCard"),
VISA_DEBIT("VISA Debit"),
LPQ_CREDIT("Lpq Credit");
companion object {
private val TAG: String = PaymentMethodType::class.simpleName
fun fromString(name: String?): PaymentMethodType? {
val maybeType = PaymentMethodType.values().firstOrNull { it.type == name }
if (maybeType == null) {
Log.e(TAG, "No corresponding PaymentMethodType for $name")
}
return maybeType
}
}
}
Просто сделанный метод getEnumFromString
проще, как этот способ.
Более того, если вы хотите сделать свой PaymentMethodType более "многоразовым, гибким и глобальным", добавьте некоторый абстрактный метод в вашPaymentMethodType
или рассмотрите возможность использования Запечатанный класс в этом случае.Мы можем догадаться, что для многих способов оплаты требуются свои собственные протоколы, а для реализации этого с помощью enum
требуется внешняя ветвь when
или if-else
.Например, код должен выглядеть следующим образом:
fun paymentProcessor(payment: PaymentMethodType): Boolean {
return when (payment) {
PAYPAL -> { processPaypalPayment() }
VISA -> { processVisaPayment() }
// ...
}
}
, что неплохо, если количество способов оплаты не ограничено, но не совсем желательно.Мы можем удалить это коварное ключевое слово if
или when
следующим образом (сохраняя подход enum class
):
enum class PaymentMethodType(val type: String) {
PAYPAL("Paypal") {
override fun processPayment(): Boolean {
TODO("Not implemented.")
}
},
VISA("Visa") {
override fun processPayment(): Boolean {
TODO("Not implemented.")
}
},
// ... more types ...
;
abstract fun processPayment(): Boolean
// ...
}
При любом подходе мы можем исключить ключевое слово when
в paymentProcessor
методе Iдемонстрируется так:
fun paymentProcessor(payment: PaymentMethodType): Boolean {
return payment.processPayment()
}
Я не объясняю sealed class
подход, так как код в этом случае не сильно отличается от подхода enum class
. Официальный документ может помочь.
Надеюсь, это поможет.