use în Kotlin

Comparare și timp Kotlin 1.0

Folosește o resursă (fișier, conexiune) într-un bloc și o închide automat la final, chiar dacă apare o excepție.

Sintaxă
inline fun <T : AutoCloseable?, R> T.use(block: (T) -> R): R

Ce face use

Resursele precum fișierele deschise, conexiunile la baze de date sau socket-urile trebuie închise cu close() după folosire. resursa.use { ... } rulează blocul cu resursa ca it și apoi apelează close() întotdeauna: și când blocul se termină normal, și când aruncă o excepție.

Este echivalentul Kotlin al lui try-with-resources din Java. Funcționează cu orice obiect Closeable sau AutoCloseable. Rezultatul lui use este rezultatul blocului, deci poți citi direct o valoare: File("a.txt").bufferedReader().use { it.readLine() }.

Parametri

Parametru Descriere
block: (T) -> R Codul care folosește resursa; primește resursa ca it.

Ce returnează

Rezultatul blocului. Resursa este închisă înainte ca valoarea să fie returnată.

Exemple

Exemplul 1: Scriere și citire de fișier cu use

Ambele fluxuri sunt închise automat la ieșirea din bloc; nu trebuie apelat close().

import java.io.File

fun main() {
    val fisier = File("note.txt")
    fisier.bufferedWriter().use { w ->
        w.write("Ana 9\n")
        w.write("Ion 7\n")
    }
    val primulRand = fisier.bufferedReader().use { it.readLine() }
    println("Primul rând: $primulRand")
    println("Tot fișierul:\n${fisier.readText()}")
}

Rezultat

Primul rând: Ana 9
Tot fișierul:
Ana 9
Ion 7

Exemplul 2: close() se apelează și la excepție

O resursă proprie, care afișează când este închisă. În al doilea bloc apare o eroare, dar „închid” este afișat înaintea mesajului erorii.

class Conexiune(private val nume: String) : AutoCloseable {
    fun trimite(mesaj: String) = println("[$nume] trimit: $mesaj")
    override fun close() = println("[$nume] închid conexiunea")
}

fun main() {
    Conexiune("server-iasi").use { it.trimite("salut") }
    try {
        Conexiune("server-cluj").use {
            it.trimite("comanda 1")
            error("conexiune pierdută")
        }
    } catch (e: IllegalStateException) {
        println("Eroare: ${e.message}")
    }
}

Rezultat

[server-iasi] trimit: salut
[server-iasi] închid conexiunea
[server-cluj] trimit: comanda 1
[server-cluj] închid conexiunea
Eroare: conexiune pierdută

Greșeli frecvente

  • Deschizi fișiere cu bufferedReader() fără use și uiți de close(). Pe Windows fișierul rămâne blocat, iar programul poate rămâne fără descriptori de fișier.
  • Returnezi resursa din bloc și o folosești după use. După bloc este deja închisă; citește tot ce îți trebuie în interior.

Comenzi înrudite

  • File.bufferedReader: Deschide un fișier pentru citire sau scriere cu buffer; se folosește cu use, ca să fie închis automat.
  • File.forEachLine: Parcurg un fișier rând cu rând, fără să-l încarce tot în memorie; fișierul se închide automat la final.
  • runCatching: Rulează un bloc și prinde orice excepție într-un Result; valoarea se scoate cu getOrNull, getOrElse sau getOrThrow.