Kotlin 1.0.5의 확장 함수 kotlin.io.use의 규격에 반하면...

7275 단어 KotlinLoan 모드

확장 함수use는 무엇입니까?


use 함수 개요


Loan 모드 확장 함수에 사용할 kotlin입니다.io 패키지에 포함됩니다.
stdlib/kotlin.io/use
inline 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());
}

총결산

  • kotlinx.지원을 통해 AutoClosable에서도 Loan 모드를 적용할 수 있습니다
  • JetBrains의 개발팀 Good job
  • 구글을 시도해 보니 의외로 해결책을 찾았다
  • 좋은 웹페이지 즐겨찾기