본문으로 바로가기

kotlin enum method

category Other 2021. 9. 19. 19:28
// jdk 1.7 style
enum class Formula {
    POWER {
        override fun calculate(n: Long): Long {
            return n * n;
        }

        // unwanted method
        override fun calculate(n: Long, m: Long): Double {
            return 0.0
        }
    },
    GAUSE {
        override fun calculate(n: Long): Long {
            return (1 + n) * (n / 2)
        }

        // unwanted method
        override fun calculate(n: Long, m: Long): Double {
            return 0.0
        }
    },
    PYTHAGORAS {
        override fun calculate(n: Long, m: Long): Double {
            return sqrt((calculate(n) + calculate(m)).toDouble())
        }

        // unwanted method
        override fun calculate(n: Long): Long {
            return 0
        }
    };
    abstract fun calculate(n: Long): Long // implements POWER, GAUSE
    abstract fun calculate(n: Long, m: Long): Double // implements PYTHAGORAS
}

위의 코드는 불필요한 메서드까지 구현해야하는 단점이 있으므로 불편합니다.

 

// jdk 8 style
import java.util.function.BiFunction
import java.util.function.Function
import kotlin.math.sqrt

enum class Formula {
    POWER(Function<Long, Long> { n: Long -> n * n }),
    GAUSE(Function<Long, Long> { n: Long -> (1 + n) * (n / 2) }),
    PYTHAGORAS(BiFunction { n: Long, m: Long -> sqrt((POWER.calculate(n) + POWER.calculate(m)).toDouble()) });

    private lateinit var expression: Function<Long, Long>
    private lateinit var pythagoras: BiFunction<Long, Long, Double>

    constructor(expression: Function<Long, Long>) {
        this.expression = expression
    }

    constructor(pythagoras: BiFunction<Long, Long, Double>) {
        this.pythagoras = pythagoras
    }

    fun calculate(value: Long): Long {
        return expression.apply(value)
    }

    fun calculate(a: Long, b: Long): Double {
        return pythagoras.apply(a, b)
    }
}

위의 방식으로 구현하면 함수형 스타일로, 불필요한 메서드까지 구현해야하는 불편함 없이 사용할 수 있습니다.