Kiedy próbowałem napisać odpowiednik try
kodu Java z zasobami w Kotlinie, nie zadziałał.
Wypróbowałem różne warianty następujących:
try (writer = OutputStreamWriter(r.getOutputStream())) {
// ...
}
Ale to nie działa.
Czy ktoś wie, czego zamiast tego użyć? Najwyraźniej gramatyka Kotlina nie ma definicji takiej konstrukcji, ale może czegoś mi brakuje. Definiuje gramatykę bloku try w następujący sposób:
try : "try" block catchBlock* finallyBlock?;
OutputStreamWriter
:r.outputStream.writer.use { ... }
use
rozszerzenie: kotlinlang.org/docs/reference/…FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
TL; DR: Brak specjalnej składni, tylko funkcja
Kotlin w przeciwieństwie do Javy nie ma do tego specjalnej składni. Zamiast tego próbuj z zasobami jest oferowana jako standardowa funkcja biblioteki
use
.W
use
implementacjeTa funkcja jest zdefiniowana jako ogólne rozszerzenie dla wszystkich
Closeable?
typów.Closeable
jest interfejsem Java, który umożliwia wypróbowanie zasobów od wersji Java SE7 .Funkcja przyjmuje literał funkcji,
block
który jest wykonywany w plikutry
. Podobnie jak w przypadku try-with-resources w Javie,Closeable
zostaje zamknięty w plikufinally
.Również awarie występujące w środku
block
prowadzą doclose
egzekucji, w których możliwe wyjątki są dosłownie „tłumione” poprzez ich ignorowanie. To różni się od try-with-zasobów , ponieważ takie wyjątki mogą być wymagane w Java rozwiązanie „s.Jak tego użyć
use
Rozszerzenie jest dostępne na każdymCloseable
rodzaju, czyli strumienie, czytelnicy i tak dalej.Część w nawiasach klamrowych jest tym, co staje się
block
wuse
(tutaj jako argument jest przekazywana lambda). Po wykonaniu blokady możesz być pewien, żeFileInputStream
została zamknięta.źródło
Edycja : Poniższa odpowiedź jest nadal ważna dla Kotlin 1.0.x. Kotlin 1.1 obsługuje standardową bibliotekę, która jest przeznaczona dla języka Java 8 w celu obsługi zamykanego wzorca zasobów.
W przypadku innych klas, które nie obsługują funkcji „use”, wykonałem następujące domowe próby z zasobami:
Następnie możesz go użyć w następujący sposób:
źródło
try/finally
blokPonieważ ten post StackOverflow znajduje się blisko początku bieżących wyników wyszukiwania hasła „przykład do zamknięcia kotlin”, a żadna z pozostałych odpowiedzi (ani oficjalnej dokumentacji) nie wyjaśnia jasno, jak rozszerzyć
Closeable
(czylijava.io.Closeable
), pomyślałem, że dodam przykład jak stworzyć własną klasę, która się rozszerzaCloseable
. To wygląda tak:A następnie, aby go użyć:
Zobacz ten przykład na placu zabaw Kotlin tutaj .
źródło