Скажем, у вас есть домен (ваши домашние животные), где вы знаете, что существует определенное перечисление (количество) типов.Например, у вас есть два и только два питомца (которых вы будете моделировать с классом MyPet
).Meowsi - ваша кошка, а Fido - ваша собака.
Сравните следующие две реализации этого надуманного примера:
sealed class MyPet
class Meowsi : MyPet()
class Fido : MyPet()
Поскольку вы использовали запечатанные классы, когда вам нужно выполнить действие в зависимости отЧто касается типа питомца, то возможности MyPet
исчерпаны в двух, и вы можете убедиться, что экземпляр MyPet
будет точно одним из двух вариантов:
fun feed(myPet: MyPet) {
when(myPet) {
is Meowsi -> print("Giving cat food to Meowsi!")
is Fido -> print("Giving dog biscuit to Fido!")
}
}
Если вы этого не сделаетеиспользуйте запечатанные классы, возможности не исчерпаны в двух, и вам нужно включить оператор else
:
open class MyPet
class Meowsi : MyPet()
class Fido : MyPet()
fun feed(myPet: MyPet) {
when(myPet) {
is Mewosi -> print("Giving cat food to Meowsi!")
is Fido -> print("Giving dog biscuit to Fido!)
else -> print("Giving food to someone else!") //else statement required or compiler error here
}
}
Другими словами, без запечатанных классов не будет исчерпания (полного охвата) возможности.
Обратите внимание, что вы можете достичь исчерпания возможностей с Java enum
, однако это не полноценные классы.Например, enum
не может быть подклассом другого класса, только реализовать интерфейс (спасибо EpicPandaForce ).
Каков вариант использования для полного исчерпания возможностей?Чтобы привести аналогию, представьте, что у вас ограниченный бюджет, и ваш корм очень ценен, и вы хотите убедиться, что не будете кормить дополнительных домашних животных, которые не являются частью вашего домашнего хозяйства.
Без sealed
class, кто-то еще в вашем доме / приложении может определить новый MyPet
:
class TweetiePie : MyPet() //a bird
И этот нежелательный питомец будет кормиться вашим методом feed
, поскольку он включен в оператор else
:
else -> print("Giving food to someone else!") //feeds any other subclass of MyPet including TweetiePie!
Аналогично, в вашей программе желательно исчерпание возможностей, потому что это уменьшает количество состояний, в которых может находиться ваше приложение, и уменьшает вероятность появления ошибок, когда у вас есть возможное состояние, где поведение плохо определено.
Отсюда необходимость sealed
классов.