Kun olio luodaan, niin mikä metodi tulisi ylikirjoittaa jos haluaa tehdä omia olion sisäisiä alustuksia? Eipä mun silmään osu mitään hyvää metodia eikä googlekaan auta! Vai pitääkö jokainen konstruktori ylikirjoittaa ja kutsua sieltä käsin omaa init-metodia (älä sano...)?
Olion OnInit-tapahtuma?
Ei löydy taaskaan!
6221
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 6
Vanhimmat
Tarkennatko vähän mitä oikein tarkoitat...?
Sulla on luokan määrittely
public class Turo{
private int i;
public Turo(){
this.i = 0;
}
public Turo(int value){
this.i = value;
}
public int getValue(){
return luku;
}
public void add(){
i ;
}
}
Mitä metodia tai konstruktoria sun pitää vielä ylikirjoittaa? Tuossa on ihan riittävästi alustuksia jos et halua useampaa muuttujaa käyttää.
Turo aki = new Turo();
käsky alustaa uuden Turo-olion, jonka nimi on aki. aki:n i-arvo on tuon käskyn jälkeen 0.
aki.addValue();
System.out.println(aki.getValue());
Rimpsun tuloksena poksahtaa ruudulle aki:n i:n arvo, eli 1.
Jos taas alustat uuden Turon käskyllä
Turo akinFaijanIrwinKotsa = new Turo(105);
ja seuraavaksi printtaat
System.out.println(akinFaijanIrwinKotsa .getValue());
ruudulle tupsahtaa 105. Käytit siis tuossa tapauksessa Turon konstruktoria, joka ottaa vastaan kokonaislukuparametrin... Teet siis ihan niin paljon konstruktoreita kuin itsestä tuntuu.
Jep, muodostin on juuri se jota kutsutaan olion luonnin yhteydessä. Muodostimet eivät kuitenkaan periydy, joten niitä ei voi ylikirjoittaa. Jokaisella luokalla on siis omat muodostimensa.
En tiedä minkälaista juttu haet (eli onko luokat valmiita, kuinka monta, kenen tekemiä, jne.). Mutta voisiko työmäärä helpottua, jos et lähtisi luomaan jokaisesta luokasta aliluokkaa, vaan tekisit olion luontia varten staattisen metodin, joka samalla myös alustaisi sen. Eli silloin olion luonnissa vaan pitäisi muistaa, esim:
"Luokka olio1 = new Luokka1(Param1)" => "Luokka olio1 = luoLuokka1(Param1)"
"Luokka1 olio1 = new Luokka1(Param1)" => "Luokka1 olio1 = luoLuokka1(Param1)"
Olio-ohjelmointilähtöinen ratkaisu olisi tämmöinen.
Luo abstrakti yliluokka, jolla on argumentiton konstruktori, joka kutsuu abstraktia init-metodia. Siis näin:
abstract class Yliluokka {
protected abstract void init();
protected Yliluokka() {
init();
}
}
Sitten peritytät tuosta luokasta oliohierarkiasi ja implementoit init-metodin aliluokissa tekemään mitä haluat. Siis näin:
class Aliluokka extends Yliluokka {
protected void init() {
// tee mitä lystäät
}
public Aliluokka(String arg1, String args) {
super();
// ja loput konstukrotista
}
}
Jos luokat ovat jo toteutettu ja luokkia on paljon, niin silloin käytetään yleensä Factory tai FactoryFactory suunnittelumallia.
Alla on neljä esimerkkiä havainnollistamassa asiaa. Kaikki esimerkit toteuttavat siis saman asian (eli alustavat olion luonnin yhteydessä) mutta kukin tekee sen eri periaatteilla.
Esimerkki 1: Jokainen olio alustetaan erikseen luonnin jälkeen. Tämä tapa on työläs ja kömpelö, koska sama alustus koodi joudutaan kirjoittamaan useampaan kertaan.
Esimerkki 2: Jokaiselle luokalle on luotu uusi aliluokka, joka suorittaa yliluokan alustuksen olion luonnin yhteydessä. Tällä tavalla luokkarakenteesta tulee helposti sekava, ja lisäksi on hieman kyseenalaista luoda uutta aliluokkaa vain yliluokan alustamista varten.
Esimerkki 3 (Factory): Luodaan yksi luokka, joka sisältää staattiset metodit olioiden luomiseen. Kyseiset metodit myös alustavat olion luonnin yhteydessä.
Esimerkki 4 (FactoryFactory): Luodaan yksi luokka, joka sisältää metodit olioiden luomiseen. Kyseiset metodit myös alustavat olion luonnin yhteydessä.
--- ESIMERKKI 1 ALKAA ---
public static void main(String[] args) {
Painike painike1 = new Painike("OK1");
olio1.asetaVäri(Väri.VIHREÄ);
Painike painike2 = new Painike("OK2");
olio2.asetaVäri(Väri.VIHREÄ);
Teksti teksti1 = new Teksti("Teksti1");
olio2.asetaVäri(Väri.VIHREÄ);
Teksti teksti2 = new Teksti("Teksti2");
olio2.asetaVäri(Väri.VIHREÄ);
// ...
}
--- ESIMERKKI 1 LOPPUU ---
--- ESIMERKKI 2 ALKAA ---
public static void main(String[] args) {
Painike painike1 = new PainikeVihreä("OK1");
Painike painike2 = new PainikeVihreä("OK2");
Teksti teksti1 = new TekstiVihreä("Teksti1");
Teksti teksti2 = new TekstiVihreä("Teksti2");
// ...
}
--- ESIMERKKI 2 LOPPUU ---
--- ESIMERKKI 3 ALKAA (FACTORY SUUNNITTELUMALLI) ---
public static void main(String[] args) {
Painike painike1 = FactoryVihreä.luoUusiPainike("OK1");
Painike painike2 = FactoryVihreä.luoUusiPainike("OK2");
Teksti teksti1 = FactoryVihreä.luoUusiTeksti("Teksti1");
Teksti teksti2 = FactoryVihreä.luoUusiTeksti("Teksti2");
// ...
}
--- ESIMERKKI 3 LOPPUU ---
--- ESIMERKKI 4 ALKAA (FACTORYFACTORY SUUNNITTELUMALLI) ---
public static void main(String[] args) {
FactoryVäri factory = new FactoryVäri(Väri.VIHREÄ);
Painike painike1 = factory.uusiPainike("OK1");
Painike painike2 = factory.uusiPainike("OK2");
Teksti teksti1 = factory.uusiTeksti("Teksti1");
Teksti teksti2 = factory.uusiTeksti("Teksti2");
// ...
}
--- ESIMERKKI 4 LOPPUU ---
Esimerkissä 1 menivät olioiden nimet hieman sekaisin asetaVari riveillä. Lisäksi piti nimetä esimerkki 4:n metodit samalla tavalla kuin esimerkki 3:n eli nimillä luoUusiXXX...