1. Properties: getters lan setters
Nalika proyek gedhe dikembangake dening puluhan programer ing wektu sing padha, masalah asring muncul yen nangani data sing disimpen ing lapangan kelas kanthi cara sing beda.
Mungkin wong gagal nyinaoni dokumentasi kelas kanthi rinci, utawa bisa uga ora nggambarake saben kasus. Akibaté, ana kahanan sing kerep nalika data internal obyek bisa dadi "rusak", nggawe obyek ora sah.
Kanggo ngindhari kahanan kasebut, umume kabeh lapangan kelas pribadhi ing Jawa . Mung cara kelas bisa ngowahi variabel kelas. Ora ana cara saka kelas liyane sing bisa langsung ngakses variabel kasebut.
Yen sampeyan pengin kelas liyane bisa njaluk utawa ngganti data ing obyek kelas, sampeyan kudu nambah rong cara kanggo kelas - cara njaluk lan cara nyetel. Tuladha:
Kode | Cathetan |
---|---|
|
private kolom jeneng Inisialisasi lapangan liwat konstruktor getName() - Cara iki ngasilake nilai lapangan jeneng setName() - Cara iki ngganti nilai kolom jeneng |
Ora ana kelas liyane sing bisa langsung ngganti nilai kolom jeneng. Yen wong kudu entuk nilai kolom jeneng, dheweke kudu nelpon getName()
metode kasebut ing Person
obyek. Yen sawetara kode pengin ngganti nilai kolom jeneng, iku kudu nelpon setName()
cara ing Person
obyek.
Cara kasebut getName()
uga disebut " getter kanggo kolom jeneng", lan setName()
metode kasebut diarani " setter kanggo kolom jeneng".
Iki minangka pendekatan sing umum banget. Ing 80-90% kabeh kode Jawa, sampeyan ora bakal bisa ndeleng variabel umum ing kelas. Nanging, bakal diumumake private
(utawa protected
), lan saben variabel bakal duwe getter lan setter umum.
Pendekatan iki ndadekake kode luwih dawa, nanging luwih dipercaya.
Ngakses variabel kelas kanthi langsung kaya ngowahi mobil liwat garis kuning pindho : luwih gampang lan luwih cepet, nanging yen kabeh wong nglakoni, kabeh bakal dadi luwih elek.
Contone, sampeyan pengin nggawe kelas sing nggambarake titik ( x
, y
). Mangkene carane programmer pemula bakal nindakake:
class Point
{
public int x;
public int y;
}
Mangkene carane programmer Java sing berpengalaman bakal nindakake:
Kode |
---|
|
Apa kode luwih dawa? temtunipun.
Nanging sampeyan bisa nambah validasi parameter kanggo getter lan setter. Contone, sampeyan bisa nggawe manawa x
lan y
tansah luwih saka nul (utawa ora kurang saka nul). Tuladha:
Kode | Cathetan |
---|---|
|
2. Umur obyek
Sampeyan wis ngerti yen obyek digawe nggunakake new
operator, nanging carane obyek dibusak? Padha ora ana ing salawas-lawase. Ora ana memori sing cukup kanggo iku.
Ing pirang-pirang basa pamrograman, kayata C++, ana delete
operator khusus kanggo mbusak obyek. Nanging kepiye carane iki bisa digunakake ing Jawa?
Ing Jawa, kabeh diatur rada beda. Jawa ora duwe operator mbusak. Iki tegese obyek ora dibusak ing Jawa? Ora, padha dibusak, mesthi. Yen ora, aplikasi Java bakal cepet kehabisan memori, lan ora bakal ana obrolan babagan program sing mlaku tanpa gangguan nganti pirang-pirang wulan.
Ing Jawa, pambusakan obyek wis rampung otomatis. Mesin Java dhewe nangani pambusakan obyek. Proses iki diarani pengumpulan sampah, lan mekanisme sing nglumpukake sampah diarani kolektor sampah ( GC ).
Dadi carane mesin Java ngerti nalika mbusak obyek?
Pengumpul sampah mbagi kabeh obyek dadi "bisa digayuh" lan "ora bisa digayuh". Yen ana paling ora siji referensi kanggo obyek, iku dianggep bisa tekan. Yen ora ana variabel sing nuduhake obyek, obyek kasebut dianggep ora bisa digayuh lan diarani sampah, tegese bisa dibusak.
Ing Jawa, sampeyan ora bisa nggawe referensi kanggo obyek sing wis ana - sampeyan mung bisa nemtokake referensi sing wis ana. Yen kita mbusak kabeh referensi kanggo obyek, iku bakal ilang ing salawas-lawase.
Referensi bunder
Logika kasebut apik banget nganti kita teka ing conto kontra sing prasaja: umpamane kita duwe rong obyek sing ngrujuk saben liyane (nyimpen referensi kanggo saben liyane). Ora ana obyek liya sing nyimpen referensi kanggo obyek kasebut.
Obyek iki ora bisa diakses saka kode, nanging isih dirujuk.
Iki sebabe pengumpul sampah mbagi obyek dadi tekan lan ora bisa digayuh tinimbang "referensi" lan "ora referensi".
Objek sing bisa digayuh
Kaping pisanan, obyek sing 100% urip ditambahake menyang dhaptar sing bisa digayuh. Contone, thread saiki ( Thread.current()
) utawa console InputStream ( System.in
).
Banjur dhaptar obyek sing bisa digayuh nggedhekake kalebu obyek sing dirujuk dening set awal obyek sing bisa digayuh. Banjur ditambahi maneh kanggo kalebu obyek sing dirujuk dening pesawat nggedhekake iki, lan ing.
Tegese yen ana sawetara obyek sing mung nuduhake siji liyane, nanging ora ana cara kanggo nggayuh saka obyek sing bisa digayuh, mula obyek kasebut bakal dianggep sampah lan bakal dibusak.
3. Ngumpulake sampah
Fragmentasi memori
Titik penting liyane sing ana gandhengane karo pambusakan obyek yaiku fragmentasi memori. Yen sampeyan terus-terusan nggawe lan mbusak obyek, memori bakal dadi pecah banget: wilayah memori sing dikuwasani bakal diselingi karo area memori sing ora dienggoni.
Akibaté, kita bisa gampang njaluk menyang kahanan sing ora bisa nggawe obyek gedhe (Contone, Uploaded karo yuta unsur), amarga ora ana cuwilan gedhe saka memori free. Ing tembung liyane, bisa uga ana memori gratis, malah akeh, nanging bisa uga ora ana blok memori gratis sing cedhak.
Optimisasi memori (defragmentasi)
Mesin Java ngatasi masalah iki kanthi cara tartamtu. Iku katon kaya iki:
Memori dipérang dadi rong bagéan. Kabeh obyek digawe (lan dibusak) mung ing setengah saka memori. Nalika nerangake wektu kanggo ngresiki bolongan ing memori, kabeh obyek ing separo pisanan disalin menyang separo kapindho. Nanging padha disalin ing jejere saben liyane supaya ora ana bolongan.
Proses katon kira-kira kaya iki:
Langkah 1: Sawise nggawe obyek
Langkah 2: Penampilan "bolongan"
Langkah 3: Ngilangi "bolongan"
Lan mulane sampeyan ora perlu mbusak obyek. Mesin Java mung nyalin kabeh obyek sing bisa digayuh menyang lokasi anyar, lan mbebasake kabeh area memori ing ngendi obyek kasebut disimpen.
GO TO FULL VERSION