Ang paraan ng pag-finalize, malapit na interface, at try-with-resources statement (Java 7) - 1

"Hi, Amigo!"

"I just decided to discuss the finalize () method with you."

"Kung naaalala mo, ang finalize() ay isang espesyal na paraan na tinatawag ng isang bagay bago ito sirain ng tagakolekta ng basura."

"Ang pangunahing layunin ng pamamaraang ito ay upang palayain ang mga ginamit na panlabas na mapagkukunang hindi Java sa pamamagitan ng pagsasara ng mga file, I/O stream, at iba pa."

"Sa kasamaang palad, ang pamamaraang ito ay hindi tumutugma sa aming mga inaasahan. Ang Java virtual machine ay maaaring ipagpaliban ang pagsira sa isang bagay, gayundin ang pagtawag sa finalize na paraan, hangga't gusto nito. Bukod dito, hindi nito ginagarantiyahan na ang pamamaraang ito ay magiging tinatawag na talaga. Maraming sitwasyon kung saan hindi ito natatawag, lahat sa pangalan ng «optimization».

"Mayroon akong dalawang reference para sa iyo:"

Si Joshua Bloch ay nagsulat ng isang magandang artikulo tungkol sa paraang ito: link
I-paraphrase ko ang isang maikling sipi:

  1. ang finalize() ay magagamit lamang sa dalawang kaso:
    1. Para sa pag-verify o paglilinis ng mga mapagkukunan gamit ang pag-log.
    2. Kapag nagtatrabaho sa katutubong code na hindi kritikal sa mga paglabas ng mapagkukunan.
  2. finalize() ginagawang 430 beses na mas mabagal ang GC sa paglilinis ng mga bagay
  3. finalize() ay maaaring hindi matawag
Kung sasabihin ko sa isang panayam na ang finalize ay isang mapanganib at mapanganib na saklay na ang mismong pag-iral ay nakakalito, tama ba ako?

"Well, that made my day, Ellie."

"May bagong statement ang Java 7 para palitan ang paraan ng pag-finalize . Ito ay tinatawag na try-with-resources . Hindi talaga ito kapalit ng finalize , sa halip ito ay isang alternatibong diskarte."

"Ito ba ay tulad ng try-catch, ngunit may mga mapagkukunan?"

"Ito ay halos tulad ng try-catch . Ang mga bagay ay, hindi tulad ng finalize () na paraan, ang panghuling pagharang sa isang try- catch-finally na pahayag ay palaging isinasagawa. Ginamit din ng mga programmer ang diskarteng ito kapag kailangan nilang magbakante ng mga mapagkukunan, isara ang mga thread, atbp.

"Narito ang isang halimbawa:"

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

"Hindi alintana kung naisakatuparan nang maayos ang try block o nagkaroon ng exception, ang panghuling block ay palaging tatawagin, at posibleng maglabas ng mga okupado na mapagkukunan doon."

"Kaya, sa Java 7, ginawa ang desisyon na gawing opisyal ang diskarteng ito, tulad nito:"

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

"Ang espesyal na pahayag ng pagsubok na ito ay tinatawag na try-with-resources (katulad ng kung paano ang mga koleksyon ay may kahaliling para sa tinatawag na foreach ).

"Pansinin na pagkatapos ng pagsubok ay may mga panaklong kung saan ang mga variable ay idineklara at ang mga bagay ay nilikha. Ang mga bagay na ito ay maaaring gamitin sa loob ng try block na ipinahiwatig ng mga kulot na bracket. Kapag ang try block ay tapos na sa pag-execute, hindi alintana kung ito ay natapos nang normal o doon. ay isang pagbubukod, ang close() na pamamaraan ay tatawagin sa anumang mga bagay na nilikha sa loob ng mga panaklong."

"Nakakatuwa! Ang notasyong ito ay mas siksik kaysa sa nauna. Hindi pa ako sigurado na naiintindihan ko ito."

"Hindi ito kasing hirap ng iniisip mo."

"Kaya, maaari ko bang tukuyin ang klase ng bawat bagay sa panaklong?"

"Oo, siyempre, kung hindi, ang mga panaklong ay walang gaanong pakinabang."

"At kung kailangan kong tumawag ng isa pang paraan pagkatapos lumabas sa try block, saan ko ilalagay iyon?"

"Medyo mas banayad ang mga bagay dito. Ipinakilala ng Java 7 ang sumusunod na interface:"

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

"Maaaring ipatupad ng iyong klase ang interface na ito. At pagkatapos ay maaari mong gamitin ang mga object nito sa loob ng isang try-with-resources statement. Tanging ang mga ganoong object lang ang maaaring gawin sa loob ng mga panaklong ng isang try-with-resources statement para sa «awtomatikong pagsasara»."

"Sa madaling salita, kailangan kong i-override ang malapit na paraan at isulat ang code dito upang «linisin» ang aking bagay, at hindi ko matukoy ang isa pang paraan?"

"Oo. Ngunit maaari kang tumukoy ng ilang bagay—paghiwalayin lamang ang mga ito gamit ang isang semicolon:"

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

"Mas mabuti iyon, ngunit hindi kasing cool na inaasahan ko."

"It's not that bad. Masasanay ka na. Sa paglipas ng panahon."