코 틀린의 자원 활용
tryKotlin에서 Java 자원 코드 와 동등한 코드 를 작성하려고 시도했을 때 작동하지 않았습니다.
나는 다음과 같은 다른 변형을 시도했다.
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
그러나 둘 다 작동하지 않습니다.
누구 대신 사용해야하는지 알고 있습니까? 분명히 Kotlin 문법 은 그러한 구문에 대한 정의 가 없지만 어쩌면 뭔가 빠졌습니다. try 블록의 문법을 다음과 같이 정의합니다.
try : "try" block catchBlock* finallyBlock?;
usekotlin stdlib ( src ) 에는 기능이 있습니다 .
사용 방법:
OutputStreamWriter(r.getOutputStream()).use {
// by `it` value you can get your OutputStreamWriter
it.write('a')
}
TL; DR
특별한 구문은 없지만 use기능
Java와 달리 Kotlin에는 이에 대한 특별한 구문이 없습니다. 대신 try-with-resources 가 표준 라이브러리 함수로 제공됩니다 use.
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
use구현
@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var closed = false
try {
return block(this)
} catch (e: Exception) {
closed = true
try {
this?.close()
} catch (closeException: Exception) {
}
throw e
} finally {
if (!closed) {
this?.close()
}
}
}
이 함수는 모든 Closeable?유형 에서 일반 확장으로 정의됩니다 . Java SE7 부터 리소스 를 사용해 볼 수있는 CloseableJava 인터페이스 입니다 . 이 함수 는 에서 실행되는 함수 리터럴 을 사용합니다 . 와 동일 시도 -과 - 자원 자바의가 됩니다 폐쇄 A의 .blocktryCloseablefinally
또한 내부에서 발생하는 장애 block는 close실행 으로 이어지는데, 예외를 무시함으로써 가능한 예외가 문자 그대로 "억제"됩니다. 이것은 다른 시도 -과 - 자원 과 같은 예외가에서 요구 될 수 있기 때문에, 자바 의 솔루션입니다.
사용 방법
use확장은 볼 수 Closeable독자 등등, 즉 스트림을 입력합니다.
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
둥근 괄호 안의 부분하게 무엇인가 block에 use(람다 여기서 인수로 전달된다). 블록이 완료된 후 FileInputStream닫혔 는지 확인할 수 있습니다 .
편집 : 다음 응답은 여전히 Kotlin 1.0.x에 유효합니다. Kotlin 1.1의 경우, 닫기 가능한 자원 패턴을 지원하기 위해 Java 8을 대상으로하는 표준 라이브러리가 지원됩니다.
"사용"기능을 지원하지 않는 다른 클래스의 경우 다음과 같은 수제 try-with-resources를 수행했습니다.
package info.macias.kotlin
inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
try {
return block(closeable);
} finally {
closeable.close()
}
}
그런 다음 다음 방법으로 사용할 수 있습니다.
fun countEvents(sc: EventSearchCriteria?): Long {
return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
var rs = it.executeQuery()
rs.next()
rs.getLong(1)
}
}
참고 URL : https://stackoverflow.com/questions/26969800/try-with-resources-in-kotlin
'Programming' 카테고리의 다른 글
| "목록 유형의 표현식에 확인되지 않은 변환이 필요합니다 ..."는 어떻게 수정합니까? (0) | 2020.07.03 |
|---|---|
| Flink와 Storm의 주요 차이점은 무엇입니까? (0) | 2020.07.03 |
| 안드로이드에서 전화를 걸고 통화가 끝나면 내 활동으로 돌아 오는 방법은 무엇입니까? (0) | 2020.07.03 |
| GitHub 프로젝트와 이정표의 차이점 / 관계는 무엇입니까? (0) | 2020.07.02 |
| 전달 된 인수가 Bash의 파일 또는 디렉토리인지 확인하십시오. (0) | 2020.07.02 |