Class Types Workbook (Part 2)


Practice problems for One Keyword Does the Work. Each takes a minute or two. Write your own answer first, then click Show answer — nothing here is a trick question, just direct practice of the syntax from the lesson.

data classes

1. A data class

Declare a data class User(val id: Int, val name: String).

Show answer Hide answer
data class User(val id: Int, val name: String)

2. Copy with a change

Given val u = User(1, "Ada"), make a copy with the same id but the name "Ada L.".

Show answer Hide answer
val u2 = u.copy(name = "Ada L.")

3. Value equality for free

Declare data class User(val id: Int, val name: String), then write the expression comparing two separate User(1, "Ada") instances for value equality.

Show answer Hide answer
data class User(val id: Int, val name: String)

User(1, "Ada") == User(1, "Ada")   // true — generated equals compares fields

enum, sealed, object

4. A small enum

Declare enum class Direction { NORTH, SOUTH, EAST, WEST }.

Show answer Hide answer
enum class Direction { NORTH, SOUTH, EAST, WEST }

5. A sealed hierarchy

Declare a sealed Result with a Success(val data: String) and an Error(val message: String) subtype.

Show answer Hide answer
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
}

6. Exhaustive when on a sealed type

Write a when expression over a Result that returns the data on success and the message on error — with no else.

Show answer Hide answer
fun describe(r: Result) = when (r) {
    is Result.Success -> r.data
    is Result.Error -> r.message
}

The compiler knows the hierarchy is closed, so the when is exhaustive without an else.

7. A singleton

Declare a singleton object Registry with a mutable list entries and an add(s: String) method.

Show answer Hide answer
object Registry {
    val entries = mutableListOf<String>()
    fun add(s: String) { entries.add(s) }
}

8. A companion factory

Give class Config private constructor(val raw: String) a companion object with a fromText(text: String): Config factory.

Show answer Hide answer
class Config private constructor(val raw: String) {
    companion object {
        fun fromText(text: String) = Config(text)
    }
}

Config.fromText("...")

inner and value classes

9. An inner class

Outer holds a val name. Add an inner class Printer whose show() prints Outer’s name.

Show answer Hide answer
class Outer(val name: String) {
    inner class Printer {
        fun show() = println(name)
    }
}

inner lets the nested class reach the outer instance’s members; a plain nested class cannot.

10. A value class

Declare a value class UserId(val raw: Int) so an id can’t be mixed up with a plain Int.

Show answer Hide answer
@JvmInline
value class UserId(val raw: Int)

A value class wraps a single value for type safety with no runtime allocation.


Back to the lesson, One Keyword Does the Work, or on to the next one: enums up close.

Comments