How to create enum constants in Kotlin

Enumerations (or enum for short) is a named list of defined constants that you can use in your program to store an arbitrary type with certain values.

In Kotlin, you can create enum constants by creating a special enum class that can have properties, implement interfaces, and create anonymous classes.

To create an enum in Kotlin, you need to define an enum class as shown below:

enum class CarType {
    TESLA,
    FORD,
    HONDA
}

And that’s all you need to do to create a basic enum. You can assign one of the enum values to a variable as follows:

val myCar = CarType.TESLA

Kotlin enum with properties

Next, you can also add properties for each enum value by adding a constructor to the enum class that defines the properties you want the values to have.

The following example adds the color: String property for the enum values:

enum class CarType(val color: String) {
    TESLA("Black"),
    FORD("Blue"),
    HONDA("Grey")
}

println("My car color is ${CarType.FORD.color}")
// My car color is Blue

You can add as many properties to your enum values as you need.

Kotin enum as anonymous classes.

You can also create anonymous classes from the enum values.

To do so, you need to transform each enum into a class with its own methods.

You also need to provide the base method (either an abstract or an open function) for the class methods.

Take a look at the example below and notice how the start() method is added to the enum class body:

enum class CarType {
    TESLA {
        override fun start() {
            println("Tesla ready to race..")
        }
    },
    FORD {
        override fun start() {
            println("Ford revving the engine..")
        }
     },
    HONDA;
    open fun start() {
        print("The car is starting..")
    }
}

CarType.HONDA.start() // The car is starting..
CarType.FORD.start() // Ford revving the engine

The base method open fun start() is defined inside the CarType body, while each enum values are free to override the method in their own anonymous class body.

Kotlin enum implementing interfaces

Finally, an enum class can also implement an interface like a normal class.

Each enum value you have would then be an anonymous class that implements the interface methods.

For example, let’s create a CarYear interface with a getManufactureYear() method that returns an Int value:

interface CarYear {
    fun getManufactureYear(): Int
}

Next, implement the CarYear interface to the CarType class.

You will then need to provide the override fun for the getManufactureYear() method in each enum value:

enum class CarType: CarYear {
    TESLA {
        override fun getManufactureYear() = 2020
    },
    FORD {
        override fun getManufactureYear() = 2019
     },
    HONDA {
        override fun getManufactureYear() = 2018
    };
}

Alternatively, you can also provide a default implementation of the interface method as shown below:

enum class CarType: CarYear {
    TESLA {
        override fun getManufactureYear() = 2020
    },
    FORD {
        override fun getManufactureYear() = 2019
     },
    HONDA;
    override fun getManufactureYear() = 2018
}

CarType.HONDA.getManufactureYear() // 2018

And that’s how you can implement an interface into an enum class type in Kotlin.

To summarize, enums in Kotlin are a bit more sophisticated than enums in traditional languages.

Enums in Kotlin is defined inside a special enum class. You can add properties, create anonymous classes, and implement interfaces.

Take your skills to the next level ⚡️

I'm sending out an occasional email with the latest tutorials on programming, web development, and statistics. Drop your email in the box below and I'll send new stuff straight into your inbox!

No spam. Unsubscribe anytime.