컴퓨터 관련/Kotlin 정보
코틀린 디자인 패턴 - 구조 패턴 이해하기 (상태)
보뇨
2024. 12. 13. 13:42
반응형
개인적으로 자바에서 상태패턴 작성할때 고민이 되던 부분이였는데 코틀린 언어적으로 처리가 가능한게 신기해서 기록해봄.
무엇보다 switch case 문은 저도 별루지만 그 기능을 만든건 다 이유가 있다고 생각하니...
우선 sealed 키워드없이 abstract 를 쓰거나 아무것도 안적게 되면 Dead 클래스에 따른 requireMoodMessage 처리가 아직 반영되지않았기때문에 에러가 발생한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Chapter03Test {
@Test
fun sealedTest() {
println(requireMoodMessage(Still()))
println(requireMoodMessage(Aggressive()))
println(requireMoodMessage(Dead()))
}
sealed class Mood
class Still : Mood()
class Aggressive : Mood()
class Dead : Mood()
fun requireMoodMessage(mood: Mood): String {
return when (mood) {
is Still -> "still doing something"
is Aggressive -> "idk why he is so aggressive"
}
}
}
|
cs |
그래서 아래와 같이 수정하게되면 더이상 에러 메시지가 나오진않는다.
다만, class 선언한쪽에서 warning 이 발생하는데 해당 이유는 equals, hashCode 를 오버라이딩해달라는 소리
이때 생각해보면 어차피 상태라는것이 중복될필요가 없기도해서 (특정 케이스의 경우 제외) 싱글톤으로 작성하면 된다.
그래서 방법은 아래를 계속 이어서 확인하면된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Chapter03Test {
@Test
fun sealedTest() {
println(requireMoodMessage(Still()))
println(requireMoodMessage(Aggressive()))
println(requireMoodMessage(Dead()))
}
sealed class Mood
class Still : Mood()
class Aggressive : Mood()
class Dead : Mood()
fun requireMoodMessage(mood: Mood): String {
return when (mood) {
is Still -> "still doing something"
is Aggressive -> "idk why he is so aggressive"
is Dead -> "walking dead"
}
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 방법 1
data object Aggressive : Mood()
// 방법 2
class Dead : Mood() {
override fun equals(other: Any?): Boolean {
return this === other
}
override fun hashCode(): Int {
return System.identityHashCode(this)
}
}
|
cs |
반응형