Kotlin 1.0.5의 확장 함수 kotlin.io.use의 규격에 반하면...
확장 함수use는 무엇입니까?
use 함수 개요
Loan 모드 확장 함수에 사용할 kotlin입니다.io 패키지에 포함됩니다.
stdlib/kotlin.io/useinline fun <T : Closeable, R> T.use(block: (T) -> R): R (source)
※ use - stdlib - Kotlin Programming Language
use 함수의 인코딩 예시// ブロックを抜けた時点で close メソッドが呼び出される(例外が発生したとしても)
FileInputStream("sample.txt").use {
while (true) {
val content = it.read()
if (content == -1) {
break;
}
print(content as? Char)
}
}
Loan 모드란 무엇입니까?
자원 (파일 또는 연결) 을 나타내는 대상은 자원 사용 후 자동으로 close 방법을 호출하여 자원 방출을 방지하는 인코딩 모드를 가리킨다.
자바에서 1.7 버전부터 언어 규범의 일부분(try-with-resources 문장)으로 내장되어 있으며, 이를 Closeable 또는 AutoCloseable 인터페이스를 실현하는 클래스 대상에 응용할 수 있다.
try-with-resources 문장의 인코딩 예시// fstream は try 節を抜けた時点で close メソッドが呼び出される(例外が発生したとしても)
try (FileInputStream fstream = new FileInputStream("sample.txt")) {
while (true) {
int content = fstream.read();
if (content == -1) {
break;
}
System.out.print((char) content);
}
}
※ The try-with-resources Statement (The Java™ Tutorials > Essential Classes > Exceptions)
※ Closeable (Java Platform SE 8 )
※ AutoCloseable (Java Platform SE 8 )
확장 함수는 무엇입니까?
확장 함수는 Kotlin에 규정된 함수 규격 중의 하나입니다.
Kotlin에서는 외부에서 특정 클래스 (수신기라고 함) 로 방법을 정의할 수 있습니다.
※ Extensions - Kotlin Programming Language
use 함수는 Closeable 인터페이스를 구현한 클래스를 매개 변수로 전달하는 블록과 블록 내에서 처리를 완료할 때close 함수를 호출하는 과정을 실현했다.
※ kotlin/ReadWrite.kt at v1.0.5 · JetBrains/kotlin
어디 반했어?
일의 경과
어떤 연결 클래스 (java.sql.Connection) 의 대상에 use 함수를 사용하여 Loan 모드를 적용하였으나 컴파일이 잘못되었습니다.
※ Connection (Java Platform SE 8 )
문제는use 함수는 수신기에서 Closeable 인터페이스를 실현하도록 요구하지만,java.sql.연결은 AutoCloseable 인터페이스만 구현된 클래스이며 Closeable은 구현되지 않았습니다.
따라서 클래스는use 함수의 확장과 관련된 곳이 아니라java입니다.sql.연결 대상에use 함수를 적용할 수 없습니다.
※ 하지만 가장 중요한 문제는 원래 Closeable과 AutoCloseable을 구분하지 않았던 저입니다.
AutoCloseable이 지원되지 않는 이유는 무엇입니까?
자바의try-with-resources 문장이 Closeable 인터페이스와 AutoCloseable 인터페이스를 동시에 지원하는 것을 감안하면 불편하다.
참고로 Kotlin은 1.0.5에서 JDK의 최소 대상 버전을 1.6으로 정했지만 AutoCloseable 인터페이스(try-with-resources 문장과 함께)는 JDK1.7에 추가된 함수이기 때문에 Kotlin은 실현을 포기한 것 같다.
※ JDK7/8 features in Kotlin 1.0 - Libraries - Kotlin Discussions
처리 방법은?
앞으로 사용자는 Closable 함수뿐만 아니라 AutoClosable 함수도 사용할 수 있습니다.
※ Kotlin 1.1에 설치할 예정입니다.
말은 비록 이렇게 말하지만, 즉 공손히 기다릴 수 없다는 것이다
선행 대응으로 JetBrains 개발팀은 확장 라이브러리를 발표했다.
kotlinx.support
Provides extension and top-level functions to use JDK7/JDK8 features in Kotlin 1.0
※ Github: Kotlin/kotlinx.support
어쨌든 kotlinx.support 이 프로그램의 라이브러리 이름은 정말 무감각하다!
이 라이브러리는 JDK1.7,1.8이라고 불리는 추가 규범의 라이브러리로 AutoClosable을 수신기로 하는use 함수를 제공하여 JDK1.7에 대한 추적을 제공합니다.
kotlinx.support.jdk7.use 인코딩 사용 예시import kotlinx.support.jdk7.use
import kotlinx.support.jdk7.suppressed
import java.sql.DriverManager
...
try {
DriverManager.getConnection("localhost:3306").use {
...
}
} catch {
...
//「抑制された例外」のチェックもお忘れなく
assert(e.suppressed.isEmpty());
}
총결산
inline fun <T : Closeable, R> T.use(block: (T) -> R): R (source)
// ブロックを抜けた時点で close メソッドが呼び出される(例外が発生したとしても)
FileInputStream("sample.txt").use {
while (true) {
val content = it.read()
if (content == -1) {
break;
}
print(content as? Char)
}
}
// fstream は try 節を抜けた時点で close メソッドが呼び出される(例外が発生したとしても)
try (FileInputStream fstream = new FileInputStream("sample.txt")) {
while (true) {
int content = fstream.read();
if (content == -1) {
break;
}
System.out.print((char) content);
}
}
일의 경과
어떤 연결 클래스 (java.sql.Connection) 의 대상에 use 함수를 사용하여 Loan 모드를 적용하였으나 컴파일이 잘못되었습니다.
※ Connection (Java Platform SE 8 )
문제는use 함수는 수신기에서 Closeable 인터페이스를 실현하도록 요구하지만,java.sql.연결은 AutoCloseable 인터페이스만 구현된 클래스이며 Closeable은 구현되지 않았습니다.
따라서 클래스는use 함수의 확장과 관련된 곳이 아니라java입니다.sql.연결 대상에use 함수를 적용할 수 없습니다.
※ 하지만 가장 중요한 문제는 원래 Closeable과 AutoCloseable을 구분하지 않았던 저입니다.
AutoCloseable이 지원되지 않는 이유는 무엇입니까?
자바의try-with-resources 문장이 Closeable 인터페이스와 AutoCloseable 인터페이스를 동시에 지원하는 것을 감안하면 불편하다.
참고로 Kotlin은 1.0.5에서 JDK의 최소 대상 버전을 1.6으로 정했지만 AutoCloseable 인터페이스(try-with-resources 문장과 함께)는 JDK1.7에 추가된 함수이기 때문에 Kotlin은 실현을 포기한 것 같다.
※ JDK7/8 features in Kotlin 1.0 - Libraries - Kotlin Discussions
처리 방법은?
앞으로 사용자는 Closable 함수뿐만 아니라 AutoClosable 함수도 사용할 수 있습니다.
※ Kotlin 1.1에 설치할 예정입니다.
말은 비록 이렇게 말하지만, 즉 공손히 기다릴 수 없다는 것이다
선행 대응으로 JetBrains 개발팀은 확장 라이브러리를 발표했다.
kotlinx.support
Provides extension and top-level functions to use JDK7/JDK8 features in Kotlin 1.0
※ Github: Kotlin/kotlinx.support
어쨌든 kotlinx.support 이 프로그램의 라이브러리 이름은 정말 무감각하다!
이 라이브러리는 JDK1.7,1.8이라고 불리는 추가 규범의 라이브러리로 AutoClosable을 수신기로 하는use 함수를 제공하여 JDK1.7에 대한 추적을 제공합니다.
kotlinx.support.jdk7.use 인코딩 사용 예시
import kotlinx.support.jdk7.use
import kotlinx.support.jdk7.suppressed
import java.sql.DriverManager
...
try {
DriverManager.getConnection("localhost:3306").use {
...
}
} catch {
...
//「抑制された例外」のチェックもお忘れなく
assert(e.suppressed.isEmpty());
}
총결산
Reference
이 문제에 관하여(Kotlin 1.0.5의 확장 함수 kotlin.io.use의 규격에 반하면...), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/msh5/items/b2c9e80f205892195416텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)