Olion OnInit-tapahtuma?

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...)?
6221
Äänestä

Muut lukivat myös

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.

Äänestä

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)"

Äänestä
  • "Luokka1 olio1 = new Luokka1(Param1)" => "Luokka1 olio1 = luoLuokka1(Param1)"

    Äänestä

  • 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
    }
    }

    Äänestä

  • fidel1 kirjoitti:

    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 ---

    Äänestä

  • Saaaaaanoja kirjoitti:

    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...

    Äänestä

Kommentoi aloitusta


Ei löydy taaskaan! kirjoitti:

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...)?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu