Kotlin Code Smell 9 - Subclassification for Code Reuse

Kotlin Code Smell 9 - Subclassification for Code Reuse

Crafting Flexible Code: The Power of Composition Over Inheritance

TL;DR: Always favor composition over inheritance.


  • Coupling

  • Maintainability


  • Composition


  • If the hierarchy follows the principle of "behaves like," then it is safe.

Sample Code


open class Rectangle(
    protected val length: Int,
    protected val width: Int
) {
    open fun area() = length * width

class Square(size: Int) : Rectangle(size, size) {
    override fun area() = length * length

class Box(size: Int) : Rectangle(size, size)


interface Shape {
    fun area(): Int

class Rectangle(
    private val length: Int,
    private val width: Int
) : Shape {
    override fun area() = length * width

class Square(private val size: Int) : Shape {
    override fun area() = size * size

class Box(size: Int) {
    private val shape: Square

    init {
        shape = Square(size)

    fun area() = shape.area()


In legacy systems, it is common to have deep hierarchies and method overriding. However, it is important to refactor them and subclass them for essential reasons rather than implementation reasons.

More info