Metode finalize, antarmuka sing bisa ditutup, lan statement try-with-resources (Jawa 7) - 1

"Hai, Amigo!"

"Aku mung mutusake kanggo ngrembug metode finalize () karo sampeyan."

"Yen sampeyan ngelingi, finalize () minangka cara khusus sing diarani obyek sadurunge pengumpul sampah ngrusak."

"Tujuan utama metode iki yaiku mbebasake sumber daya eksternal non-Jawa kanthi nutup file, stream I/O, lan liya-liyane."

"Sayange, cara iki ora cocog karo pangarepan kita. Mesin virtual Jawa bisa nundha ngrusak obyek, uga nelpon metode finalize, anggere dikarepake. Kajaba iku, ora njamin yen metode iki bakal dadi disebut kabeh. Ana akeh kahanan sing ora bisa diarani, kabeh kanthi jeneng «optimasi».

"Aku duwe rong referensi kanggo sampeyan:"

Joshua Bloch wis nulis artikel sing apik babagan cara iki: link
Aku bakal paraphrase kutipan singkat:

  1. finalize () mung bisa digunakake ing rong kasus:
    1. Kanggo verifikasi utawa ngresiki sumber daya kanthi logging.
    2. Nalika nggarap kode asli sing ora kritis kanggo bocor sumber.
  2. finalize () ndadekake GC 430 kaping luwih alon ing reresik obyek
  3. finalize () bisa uga ora disebut
Yen aku ngomong ing wawancara yen finalize minangka crutch mbebayani lan mbebayani sing orane mbingungake, apa aku bener?

"Inggih, punika damel dinten kula, Ellie."

"Jawa 7 duwe statement anyar kanggo ngganti metode finalize . Iki diarani try-with-resources . Iku dudu pengganti finalize , nanging minangka pendekatan alternatif."

"Apa kaya nyoba-nyekel, nanging kanthi sumber daya?"

"Iku meh kaya nyoba-nyekel . Prakara iku, ora kaya finalize () cara, pungkasan pamblokiran ing statement try- nyekel-finally tansah kaleksanan. Programmer uga wis digunakake technique iki nalika padha wis needed kanggo mbebasake sumber daya, nutup thread, etc.

"Iki conto:"

InputStream is = null;
try
{
 is = new FileInputStream("c:/file.txt");
 is.read(…);
}
finally
{
 if (is != null)
 is.close();
}

"Ora preduli apa blok coba dieksekusi kanthi bener utawa ana pangecualian, pamblokiran pungkasan bakal tansah disebut, lan bisa ngeculake sumber daya sing dikuwasani ing kana."

"Dadi, ing Jawa 7, keputusan digawe kanggo nggawe pendekatan iki resmi, kaya mangkene:"

try(InputStream is = new FileInputStream("c:/file.txt"))
{
 is.read(…);
}

"Pernyataan nyoba khusus iki diarani try-with-resources (padha karo carane koleksi duwe alternatif kanggo disebut foreach ).

"Elinga yen sawise nyoba ana tanda kurung ing ngendi variabel diumumake lan obyek digawe. Obyek iki bisa digunakake ing blok try sing dituduhake dening kurung kriting. Nalika blok try wis rampung dieksekusi, preduli saka rampung normal utawa ana. minangka pangecualian, metode close () bakal diarani obyek sing digawe ing jero kurung."

"Apik tenan! Notasi iki luwih kompak tinimbang sing sadurunge. Aku durung ngerti."

"Iku ora angel kaya sing sampeyan pikirake."

"Dadi, aku bisa nemtokake kelas saben obyek ing kurung?"

"Ya, mesthine, yen ora ana kurung, ora ana gunane."

"Lan yen aku kudu nelpon cara liyane sawise metu saka blok nyoba, aku sijine ing ngendi?"

"Iku luwih subtle ing kene. Java 7 ngenalake antarmuka ing ngisor iki:"

public interface AutoCloseable
{
 void close() throws Exception;
}

"Kelas sampeyan bisa ngleksanakake antarmuka iki. Banjur sampeyan bisa nggunakake obyek kasebut ing statement try-with-resources. Mung obyek kasebut bisa digawe ing jero kurung statement try-with-resources kanggo "penutupan otomatis".

"Ing tembung liyane, aku kudu nolak cara cedhak lan nulis kode ing kanggo «ngresiki» obyek, lan aku ora bisa nemtokake cara liyane?"

"Ya. Nanging sampeyan bisa nemtokake sawetara obyek-mung misahake karo titik koma:"

try(
InputStream is = new FileInputStream("c:/file.txt");
OutputStream os = new FileOutputStream("c:/output.txt")
)
{
 is.read(…);
 os.write(…);
}

"Sing luwih apik, nanging ora kaya sing dikarepake."

"Iku ora ala. Sampeyan bakal digunakake kanggo iku. Kanthi wektu."