Enum classes
Enumeration types are used to define a set of named constants. Kotlin, same as Java has an enumeration type, the enum
class. Let's say that you want to define a type that represents all months in a year. Yes, you could create a normal class with one property, month name, which is of String
 type. But, then you would have to guard against invalid month name assignments and throw exceptions in such cases. The class would be error-prone and users of your class wouldn't be happy. This is a perfect use case for the enum class, and here is how you would define an enum
type to represent all the months of the year:
enum class Month { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER }
Now you can't have invalid months, and if you want to assign a month type to a variable, you can only choose from the constants we have defined:
val march = Month.MARCH
Enum classes, both in Kotlin and in Java, are full-blown classes, so they can have members,...