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