Saya dalam proses belajar Java dan saya tidak dapat menemukan penjelasan yang baik di implements Closeable
dan implements AutoCloseable
interface.
Saat saya mengimplementasikan interface Closeable
, Eclipse IDE saya membuat metode public void close() throws IOException
.
Saya dapat menutup aliran menggunakan pw.close();
tanpa antarmuka. Tetapi, saya tidak dapat memahami bagaimana saya dapat mengimplementasikan close()
metode menggunakan antarmuka. Dan, apa tujuan dari antarmuka ini?
Saya juga ingin tahu: bagaimana cara memeriksa apakah IOstream
benar-benar tutup?
Saya menggunakan kode dasar di bawah ini
import java.io.*;
public class IOtest implements AutoCloseable {
public static void main(String[] args) throws IOException {
File file = new File("C:\\test.txt");
PrintWriter pw = new PrintWriter(file);
System.out.println("file has been created");
pw.println("file has been created");
}
@Override
public void close() throws IOException {
}
Jawaban:
Menurut saya, Anda tidak terlalu akrab dengan antarmuka. Dalam kode yang telah Anda posting, Anda tidak perlu menerapkannya
AutoCloseable
.Anda hanya perlu (atau harus) mengimplementasikan
Closeable
atauAutoCloseable
jika Anda akan mengimplementasikannya sendiriPrintWriter
, yang menangani file atau resource lain yang perlu ditutup.Dalam implementasi Anda, cukup dengan memanggil
pw.close()
. Anda harus melakukan ini di blok terakhir:Kode di atas terkait dengan Java 6. Di Java 7 ini bisa dilakukan dengan lebih elegan (lihat jawaban ini ).
sumber
PrintWriter
? TerutamaAutoClosable
objek dapat digunakan dalam lebih banyak keadaan daripada hanyaPrintWriter
s ...PrintWriter
jadi saya sebutkan untuk lebih spesifik.AutoCloseable
? Lebih baik tunjukkantry-with-resources
saja…AutoCloseable
(diperkenalkan di Java 7) memungkinkan penggunaan idiom try-with-resources :Sekarang Anda dapat mengatakan:
dan JVM akan menelepon
close()
secara otomatis untuk Anda.Closeable
adalah antarmuka yang lebih lama.Untuk beberapa alasanUntuk menjaga kompatibilitas ke belakang, desainer bahasa memutuskan untuk membuat yang terpisah. Hal ini memungkinkan tidak hanya semuaCloseable
kelas (seperti pelemparan aliranIOException
) untuk digunakan dalam percobaan dengan sumber daya, tetapi juga memungkinkan pelemparan pengecualian yang dicentang yang lebih umum dariclose()
.Jika ragu, gunakan
AutoCloseable
, pengguna kelas Anda akan berterima kasih.sumber
Closeable.close()
lemparanIOException
. Banyakclose()
metode yang bisa menguntungkan dari try-dengan-sumber membuang pengecualian diperiksa lainnya (misalnyajava.sql.Connection.close()
jadiAutoCloseable.close()
melemparException
Mengubah ada.Closeable
Kontrak akan memecahkan semua aplikasi yang ada / perpustakaan mengandalkan kontrak yangclose()
hanya melemparIOException
dan tidak semua (diperiksa) pengecualian.Closeable.close()
dituntut untuk menjadi idempoten.AutoCloseable.close()
tidak, meski masih sangat disarankan.public void close( ) throws Exception
- gunakan pengecualian yang lebih spesifik jika Anda bisa (misalnya IOException)Closeable
tidak menjamin idempotensi. Ini membutuhkan idempotensi dalam implementasiclose()
metode oleh pengguna. Dan apakahIOException
lebih spesifik / sesuai tergantung pada kasus penggunaan.Closeable
meluasAutoCloseable
, dan secara khusus didedikasikan untuk aliran IO: ini melontarkan IOException dan bukan Exception, dan idempoten, sedangkan AutoCloseable tidak memberikan jaminan ini.Ini semua dijelaskan di javadoc dari kedua antarmuka.
Menerapkan AutoCloseable (atau Closeable) memungkinkan kelas untuk digunakan sebagai sumber daya dari konstruksi coba-dengan-sumber daya yang diperkenalkan di Java 7, yang memungkinkan penutupan sumber daya tersebut secara otomatis di akhir blok, tanpa harus menambahkan blok akhirnya yang menutup sumber daya secara eksplisit.
Kelas Anda tidak mewakili sumber daya yang bisa ditutup, dan sama sekali tidak ada gunanya mengimplementasikan antarmuka ini: IOTest tidak bisa ditutup. Seharusnya tidak mungkin untuk membuat instance, karena tidak memiliki metode instance apa pun. Ingatlah bahwa mengimplementasikan antarmuka berarti ada hubungan is-a antara kelas dan antarmuka. Anda tidak memiliki hubungan seperti itu di sini.
sumber
Inilah contoh kecilnya
Inilah hasilnya:
sumber
this.close()
atau sesuatu dalam kode ?, karena dipanggil secara otomatis. (Hanya untuk memastikan)The
try-with-resources
Pernyataan.Ini
try-with-resources statement
adalahtry
pernyataan yang mendeklarasikan satu atau lebih resource. Aresource
adalah objek yang harus ditutup setelah program selesai dengannya. Thetry-with-resources statement
memastikan bahwa setiap sumber daya ditutup pada akhir pernyataan tersebut. Objek apa pun yang diimplementasikanjava.lang.AutoCloseable
, yang menyertakan semua objek yang diimplementasikanjava.io.Closeable
, dapat digunakan sebagai sumber daya.Contoh berikut membaca baris pertama dari sebuah file. Ini menggunakan contoh
BufferedReader
untuk membaca data dari file.BufferedReader
adalah sumber daya yang harus ditutup setelah program selesai dengannya:Dalam contoh ini, sumber daya yang dideklarasikan dalam pernyataan coba-dengan-sumber daya adalah BufferedReader. Pernyataan deklarasi muncul dalam tanda kurung segera setelah kata kunci coba. Kelas
BufferedReader
, di Java SE 7 dan yang lebih baru, mengimplementasikan antarmukajava.lang.AutoCloseable
. KarenaBufferedReader
instance dideklarasikan dalam pernyataan try-with-resource, itu akan ditutup terlepas dari apakah pernyataan try selesai secara normal atau tiba-tiba (sebagai hasil dari metode yangBufferedReader.readLine
dilemparkanIOException
).Sebelum Java SE 7, Anda dapat menggunakan
finally
blok untuk memastikan bahwa sumber daya ditutup terlepas dari apakah pernyataan try selesai secara normal atau tiba-tiba. Contoh berikut menggunakanfinally
blok, bukantry-with-resources
pernyataan:Silakan merujuk ke dokumen .
sumber
Baru-baru ini saya telah membaca Buku Panduan Programmer Java SE 8 ii.
Saya menemukan sesuatu tentang perbedaan antara
AutoCloseable
vsCloseable
.The
AutoCloseable
antarmuka diperkenalkan di Jawa 7. Sebelum itu, antarmuka lain ada yang disebutCloseable
. Itu mirip dengan apa yang diinginkan oleh desainer bahasa, dengan pengecualian berikut:Closeable
membatasi jenis pengecualian yang diberikanIOException
.Closeable
membutuhkan implementasi untuk menjadi idempoten.Para desainer bahasa menekankan kompatibilitas ke belakang. Karena mengubah antarmuka yang ada tidak diinginkan, mereka membuat antarmuka baru yang disebut
AutoCloseable
. Antarmuka baru ini tidak seketatCloseable
. KarenaCloseable
memenuhi persyaratanAutoCloseable
, itu mulai diterapkanAutoCloseable
ketika yang terakhir diperkenalkan.sumber
Closeable
", saya sarankan untuk mengatakan "Antarmuka baru ini dapat digunakan dalam konteks yang lebih umum, di mana pengecualian yang dilemparkan selama penutupan belum tentu merupakan IOException". Di alam semesta Jawa, menjadi "kurang ketat" memiliki kesan negatif tentangnya.