일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- mongodb lookup
- 안정해시
- 익명 객체 @transactional
- 백준 2252 줄세우기
- 자바 백준 팩토리얼 개수
- java 파티
- 백준 1504 java
- 전략 패턴이란
- rabbitmq 싱글톤
- ipfs bean
- spring mongoTemplate switch
- kotiln functional interface
- nodejs rabbitmq
- go
- java 1509
- java 팩토리얼 개수
- 자바 1676
- 백준 특정한 최단 경로
- ipfs singletone
- 백준 연결요소 자바
- java 1238
- java 백준 1509
- Spring ipfs
- kotiln const val
- spring mongodb switch
- javav 1676
- Java Call By Refernce
- kotiln const
- spring mongodb
- spring mongoTemplate
Archives
- Today
- Total
공부 흔적남기기
kotlin interface 익명 내부함수 lambda로 대체 본문
728x90
반응형
Kotlin fun interface와 interface 차이
먼저 fun interfcace를 사용하게된 계기...
interface LogCallStrategy<T> {
fun call() : T
}
다음과 같은 인터페이스가 있고
class LogHelperStrategy<T>(
private val logService: LogServiceDirtyCode,
private val logCallStrategy: LogCallStrategy<T>,
) {
fun execute(message: String): T {
var trace: Trace? = null
return runCatching {
trace = logService.begin(message)
logCallStrategy.call()
}.onSuccess {
logService.finish(trace!!)
}.onFailure {
logService.execption(trace!!)
throw it
}.getOrThrow()
}
}
위 인터페이스를 주입 받아서 사용하는 객체가 있다 (전략패턴)
나는 위 LogHelper를 사용할떄 다음과 같이 사용하고 싶었다.
@GetMapping
fun getItems(): List<Item> {
return LogHelperStrategy(logService) {
itemService.getItems()
}.execute("ItemControllerStrategy/getItems")
}
interface에 override를 할 fun이 하나이기 떄문에 Java에서 그래왔듯이 당연히 될거라고 착각했다.
fun getItems(): List<Item> {
return LogHelperStrategy(logService, object :LogCallStrategy<List<Item>>{
override fun call(): List<Item> {
return itemService.getItems()
}
}).execute("ItemControllerStrategy/getItems")
}
이렇게는 아주 잘되는데 왜 람다를 사용하면 받질 못하니...
Required:
LogCallStrategy<TypeVariable(T)>
Found:
() → List<Item> 계속 이런 error가 떳다..
찾아본 결과 kotiln에서 익명 내부함수를 람다로 사용하기 위해선 fun interface를 사용해야한다고 한다.
fun interface LogCallStrategy<T> {
fun call() : T
}
다음과 같이 수정하니 lambda로 잘 받아진다.
interface인데 함수가 하나이고 용도가 하나의 함수를 호출하는 용도이며 확장가능성이 없을때 funtional interface를 사용하자
728x90
반응형
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
kotiln 객체 복사 방식 (얕은복사/copy()/깊은복사) (0) | 2024.11.24 |
---|---|
kotlin/java latch await not work 문제 troubleshooting (0) | 2023.07.10 |
kotlin inline function 사용 이유 (0) | 2022.12.06 |