// 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)
}
}
위의 방식으로 구현하면 함수형 스타일로, 불필요한 메서드까지 구현해야하는 불편함 없이 사용할 수 있습니다.