2013년 1월 13일 일요일

Scala 로 java enum 구현하기

Scala 에는 특별히 enum 수형이 따로 정의되어 있지 않습니다. 그래서 java enum 과 유사하게 구현할 수 없습니다.
그래서 Scala 에서는 Enumeration 을 상속받은 Object 로 표현하면 됩니다. 다음 코드는 요일을 나타내는 DayOfWeek 값을 표현합니다.

package kr.kth.timeperiod
import org.joda.time.DateTimeConstants
/**
* 한 주의 요일을 표현합니다.
* User: sunghyouk.bae@gmail.com
* Date: 13. 1. 13.
*/
object ScalaDayOfWeek extends Enumeration {
type ScalaDayOfWeek = Value
// NOTE: withName, apply 메소드를 사용하세요
val Monday = Value(DateTimeConstants.MONDAY, "Monday")
val Tuesday = Value(DateTimeConstants.TUESDAY, "Tuesday")
val Wednesday = Value(DateTimeConstants.WEDNESDAY, "Wednesday")
val Thursday = Value(DateTimeConstants.THURSDAY, "Thursday")
val Friday = Value(DateTimeConstants.FRIDAY, "Friday")
val Saturday = Value(DateTimeConstants.SATURDAY, "Saturday")
val Sunday = Value(DateTimeConstants.SUNDAY, "Sunday")
}
실제 사용은 java enum 과 유사합니다만 꼭 import ScalaDayOfWeek._ 를 해줘야 합니다.
그리고 java 의 valueOf(String value) 는 withName(value:String) 을 사용하면 됩니다.

package kr.kth.timeperiod
import kr.kth.commons.slf4j.Logging
import org.junit.{Assert, Test}
import org.joda.time.DateTimeConstants
/**
* kr.kth.timeperiod.ScalaDayOfWeekTest
* User: sunghyouk.bae@gmail.com
* Date: 13. 1. 13.
*/
class ScalaDayOfWeekTest extends Logging {
@Test
def dayOfWeekEquals() {
val sunday = ScalaDayOfWeek.Sunday
val parsed = ScalaDayOfWeek.withName("Sunday")
Assert.assertEquals(sunday, parsed)
Assert.assertEquals("Sunday", sunday.toString)
Assert.assertNotEquals(ScalaDayOfWeek.Friday,ScalaDayOfWeek.Monday)
Assert.assertEquals(ScalaDayOfWeek.Monday, ScalaDayOfWeek(DateTimeConstants.MONDAY))
log.debug(ScalaDayOfWeek.values)
}
}
Scala 언어로 Java 라이브러리 사용이라던가, 변환은 대부분은 다 됩니다. 표현력이 더 좋으니까요^^
다만 Java 에서 Scala 로 된 라이브러리를 사용하려면, 안되는 것이 많습니다.
제가 고민 중인 부분이기도 합니다.

뭐 경험이 쌓이면 방법이 생기겠죠^^

댓글 없음: