Joskus kirjoittamalla vähän enemmän voi saada aikaan nopeampaa ja turvallisempaa koodia. Niin tässäkin tapauksessa. Nimittäin säätäminen siinä, ettemme vaivautuneet kirjoittamaan muodostajia hirveän huolella, johtaa siihen että esimerkiksi alustus
AikaSek8 a4 = new AikaSek8(14,55,45);
kutsuu kaikkiaan seuraavia metodeja:
AikaSek8(14,55,45); Aika5(); // koska oli Aika5 pitää alustaa aluksi Aika5.aseta(0,0); Aika5.lisaa(0); // Tässä Aika5, koska ei vielä "kasvanut" AikaSek8 AikaSek8.aseta(14,55,45); Aika5.aseta(14,55); Aika5.lisaa(0); // Aika.lisaa(0,0); AikaSek8.lisaa(0,0); Aika5.lisaa(0,0);
Olisitko arvannut! Enää ei tarvitse ihmetellä miksi olio-ohjelmat ovat isoja ja hitaita. Totta kai voitaisiin sanoa, että hyvän kääntäjän olisi pitänyt huomata tuosta optimoida päällekkäisyydet pois. Mutta tämä on vielä tänä päivänä kova vaatimus kääntäjälle. Mutta ehkäpä voisimme ohjelmoijina vähän auttaa:
public AikaSekB(int h,int m, int s) { // Muodostaja super(h,m); this.s = s; lisaa(0,0); } public AikaSekB(int h,int m) { super(h,m); s = 0; } public AikaSekB(int h) { super(h); s = 0; } public AikaSekB() { super(); s = 0; }
public AikaB() { this.h = 0; this.m = 0; } public AikaB(int h) { aseta(h,0); } public AikaB(int h,int m) { aseta(h,m); }
Samalla on riisuttu pois alustukset
private int h=0, m=0; ja muutettu muotoon private int h,m;
Nyt on saatu ainakin seuraavat edut: oletustapauksessa kumpikin luokka alustuu pelkillä 0:ien sijoituksilla, ilman yhtään ylimääräistä kutsua.
ELI! Perityn yliluokan muodostajaa kutsutaan automaattisesti, jollei sitä itse tehdä. Nyt parametrillisessa muodostajassa kutsutaan yliluokan muodostajaa, ja näin voidaan välttää ainakin oletusmuodostajan kutsu:
public AikaSekB(int h,int m, int s) { super(h,m); this.s = s; lisaa(0,0); }
Nyt alustuksesta
AikaSekB a4 = new AikaSekB(14,55,45);
seuraa seuraavat metodikutsut
AikaSekB(14,55,45); AikaB(14,55); // koska oli Aika5 pitää alustaa aluksi AikaB.aseta(14,55); AikaB.lisaa(0); // Tässä AikaB, koska ei vielä "kasvanut" AikaSek8 AikaSekB.lisaa(0,0); AikaB.lisaa(0,0);
Turhaahan tuossa on vieläkin, mutta tippuihan kuitenkin noin puolet pois! Joka tapauksessa periminen tuottaa jonkin verran koodia, aina kun yliluokan metodeja käytetään hyväksi. Ja jollei käytettäisi, kirjoitettaisiin samaa koodi uudelleen, eli palattaisiin 70-luvulle. Nykyisin kasvanut koneteho kompensoi usein tehottomamman oliokoodin ja olio-ohjelmoinnin ansiosta pystytään kirjoittamaan luotettavampia (?) ja monimutkaisempia ohjelmia. Eli etusija pitää antaa koodin selkeydelle ja ylläpidettävyydellä. Edellä esitetyt "kikkailut" huonontavat ylläpidettävyyttä jos jotakin oleellista muutetaan.