Java - konštruktory

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání

Vytvorenie objektu - konštruktor triedy

Konštruktor je základná metóda, ktorá sa vykoná jednorázovo ihneď po vytvorení objektu, jej názov je rovnaký, ako názov triedy a nesmie mať uvedený žiadny návratový typ (t.j. ani void). Môžeme v nej nastaviť hodnoty premenným v novovytvorenom objekte. Prvý z konštruktorov uvedieme, aby sme mohli konštruovať objekt bez uvedenia počiatočných hodnôt polohy a rýchlosti (po vytvorení objektu bude poloha aj rýchlosti nulové). Druhý konštruktor je už "užitočný", môžeme ním vytvoriť objekt s požadovanými hodnotami polohy a nulovou rýchlosťou, tretím špecifikujeme polohu aj rýchlosť.

Každá trieda by mala mať aspoň jeden konštruktor. Ak ho nemá, kompilátor vytvorí defaultný konštruktor, ktorý nevykonáva žiadnu funkciu. Počet konštruktorov nie je obmedzený. V praxi sa vytvorí toľko konštruktorov, koľkými spôsobmi potrebujeme vytvoriť objekt.

Vráťme sa k triede Castica. Vytvoríme niekoľko konštruktorov, podľa toho akú chceme vytvoriť časticu (jej súradnice x, y, z a rýchlosti pohyby vx, vy, vz.

  1. Chceme, aby bolo možné vytvoriť objekt Castica, s polohou v bode [0,0,0] a rýchlosťou pohybu vo všetkých osiach taktiež 0. Definujme teda konštruktor, ktorý takúto časticu vytvorí. Toto je prvý prípad v nasledujúcom zdrojovom kóde. Konštruktor je bez parametreov a všetky triedne premenné nastaví na nulovú hondotu.
  2. Chceme, aby bolo možné vytvoriť objekt Castica, s polohou v želanom bode [Z,Y,Z] a rýchlosťou pohybu vo všetkých osiach 0. Konštruktor bude mať 3 parametre - budú to súradnice Z,Y a Z. Hodnoty parametrov uložíme do premenných triedy Castica (x,y,z).
  3. Tretí konštruktor vytvorí časticu, ktorá má presne definovanú polohu (X,Y,Z) a taktiež rýchlosť vo všetkých troch osiach (vX,vY,vZ)
  4. Pre zaujímavosť si môžeme definovať ešte jeden konštruktor. Tento konštruktor nastaví súradnice častice na [0,0,0] a rýchlosť nastaví vo všetkých osiach na rovnakú hodnotu - v.
class Castica {
  double x, y, z, vx, vy, vz;
  
  public Castica() {
    this.x = 0;
    this.y = 0;
    this.z = 0;
    this.vx = 0;
    this.vy = 0;
    this.vz = 0;
  }

  public Castica(double X, double Y, double Z) {
    this.x = X;
    this.y = Y;
    this.z = Z;
    this.vx = 0;
    this.vy = 0;
    this.vz = 0;
  }

  public Castica(double X, double Y, double Z, double vX, double vY, double vZ) {
    this.x = X;
    this.y = Y;
    this.z = Z;
    this.vx = vX;
    this.vy = vY;
    this.vz = vZ;
  }

  public Castica(double v) {
    this.x = 0;
    this.y = 0;
    this.z = 0;
    this.vx = v;
    this.vy = v;
    this.vz = v;
  }

  public void move(double dt) {
    x = x + dt * vx;
    y = y + dt * vy;
    z = z + dt * vz;
  }
  
  public String toString() {
    return "Castica je v mieste: " + x + ", " + y + ", " + z + "\n" +
           "a ma rychlost: " + vx + ", " + vy + ", " + vz;
  }
}

Ak trieda obsahuje viacej konštruktorov, hovoríme o prekrývaní konštruktorov. Ako si ukážeme neskôr, prekrývať je možné aj štandardné metódy triedy. Pri vytváraní nového objektu si java vyberie taký konštruktor, ktorý jej podľa typu a počtu argumentov 'pasuje' do volania operátora new.

Novu triedu otestujeme štandardným postupom, vyskúšajte si použitie oboch typov konštruktorov

class Test02 {
  public static void main(String[] args) {
    Castica c1 = new Castica(0.1, 0.2, 1.1, -0.5, 0.4, 0.2);
    Castica c2 = new Castica(0.1, 0.2, 1.1);
    Castica c3 = new Castica(0.2);
    System.out.println(c1);
    c1.move(0.1);
    System.out.println(c1);

    System.out.println(c2);
    c2.move(0.1);
    System.out.println(c2);

    System.out.println(c3);
    c3.move(0.1);
    System.out.println(c3);
  }
}

Duplicita kódu v prekrytých konštruktoroch

Všimnime si, že v tele každého konštruktora je skoro rovnaký kód. Tento kód sa líši len priradením hodnôt jednotlivým členom triedy. Pri pridaní nového konštruktora, musíme tento kód napísať znova. Aby sme sa vyhli duplikovaniu kódu v prekrytých konštruktoroch, môžeme vo všeobecnejší definícii konštruktora zavolať konštruktok špecifickejší. Využijeme ten fakt, že vo vnútri triedy je metóda konštruktora označovaná aj ako this. Vytvorme triedu Castica ešte raz a vytvorme iba jeden konštruktor, ktorý nastaví všetky hodnoty vnútorných premenných triedy na konkrétne hodnoty.

    public Castica(double X, double Y, double Z, double vX, double vY, double vZ)

Pri implementovaní ostatných konštruktorov využijeme tento konštruktor tak, že hodnoty parametrov nastavíme na želané hodnoty. Ešte raz poznamenávame, že koštruktor Castica sa vo vnútri triedy Castica zavolá pomocou volania this nasledovne:

    this(double X, double Y, double Z, double vX, double vY, double vZ)

Nasleduje výpis triedy Castica, bez duplikovania kódu v prekrytých konštruktoroch.

class Castica {
  double x, y, z, vx, vy, vz;

  public Castica(double X, double Y, double Z, double vX, double vY, double vZ) {
    this.x = X;
    this.y = Y;
    this.z = Z;
    this.vx = vX;
    this.vy = vY;
    this.vz = vZ;
  }
  
  public Castica() {
    this(0,0,0,0,0,0);
  }

  public Castica(double X, double Y, double Z) {
     this(X,Y,Z,0,0,0);
  }

  public Castica(double v) {
     this(0,0,0,v,v,v);
  }

}