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
class Person
{
   private String name;

   public Person(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return name;
   }

   public void setName(String name)
   {
      this.name = name;
   }
}


privatekolom 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 Personobyek. Yen sawetara kode pengin ngganti nilai kolom jeneng, iku kudu nelpon setName() cara ing Personobyek.

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
class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }

   public int getX() {
      return x;
   }

   public void setX(int x) {
      this.x = x;
   }

   public int getY() {
      return y;
   }

   public void setY(int y) {
      this.y = y;
   }
}

Apa kode luwih dawa? temtunipun.

Nanging sampeyan bisa nambah validasi parameter kanggo getter lan setter. Contone, sampeyan bisa nggawe manawa xlan ytansah luwih saka nul (utawa ora kurang saka nul). Tuladha:

Kode Cathetan
class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
      this.x = x < 0 ? 0 : x;
      this.y = y < 0 ? 0 : y;
   }

   public int getX() {
      return x;
   }

   public void setX(int x) {
      this.x = x < 0 ?  0 : x;
   }

   public int getY() {
      return y;
   }

   public void setY(int y) {
      this.y = y < 0 ? 0 : y;
   }
}


2. Umur obyek

Sampeyan wis ngerti yen obyek digawe nggunakake newoperator, 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 deleteoperator 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

Ngumpulake sampah ing Jawa

Langkah 2: Penampilan "bolongan"

Ngumpulake sampah ing Jawa 2

Langkah 3: Ngilangi "bolongan"

Ngumpulake sampah ing Jawa 3

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.