Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Muuttujan globaalisuus

Sivun loppuun

tkok [29.01.2009 14:14:53]

#

Moi, Aloin taas tutkimaan javan alkeita.

Kuinka voin javassa luoda muuttujan joka olisi muidenkin funktioiden käytössä kuin vain siinä jossa sen luon?

tsuriga [29.01.2009 14:17:32]

#

http://javala.cs.tut.fi/en/show.do;?category­=oliot_javassa#attribuutit

tkok [29.01.2009 14:22:24]

#

Tuossa ne muuttujat luodaan metodin ulkopuolella, classin sisällä. Tarkoitukseni siis on luoda muuttuja metodissa, mutta voinko siis kirjoittaa metodin sisälle suoraan esim.

public static void metodi(){
	public int r=15;
}

EDIT: niin siis kokeilin tehdä näin ja erroria antaa :(

Mobel [29.01.2009 14:42:10]

#

En nyt heti keksi mihin käyttöön tuota tarvitset, mutta käykö, jos metodi palauttaa muuttujan?
Esim.

public static int getSade(){
   return 15;
}

Ja nyt metodia kutsuttaessa se palauttaa arvon 15.

Et varmaan tätä hakenut, mutta laitampa silti.

tkok [29.01.2009 15:06:56]

#

Mobel kirjoitti:

En nyt heti keksi mihin käyttöön tuota tarvitset, mutta käykö, jos metodi palauttaa muuttujan?
Esim.

public static int getSade(){
   return 15;
}

Ja nyt metodia kutsuttaessa se palauttaa arvon 15.

Et varmaan tätä hakenut, mutta laitampa silti.

Joo en tätä kaivannu, mutta jostain syystä päättelin että kun luon taulukon:

public int[] taulu= new int[10];

Tarvitsisi tietää sen koko, mutta ilmeisesti pystyn varaamaan taulukolle nimen classissa:

public int[] taulu;

Ja sitten metodissa määrittelen sen koon:

int koko= 10;
taulu=new int[koko];

Mutta nyt kun kokeilin näin tehdä niin tulee errori etten voi määritellä non-static muuttujaa taulu static-kontekstissa. Mitäs seuraavaksi keksis?

EDIT: siis koko ongelma alkoi siitä kun yritin luoda taulukkoa, jonka koko vaihtelee ajokerrasta toiseen, mutta jonka pitää olla kaikkien metodien käytössä, ja taulukon koon antaa käyttäjä alussa.

Päärynämies [29.01.2009 15:38:17]

#

Ihan selville en nyt päässyt mikä on se haluttu lopputulos. Ratkaisuksi ei käy, että luot määrittelet viitteen tuohon taulukkoon jonkun luokan jäseneksi, luokan konstruktorissa sitten luot haluamasi kokoisen taulukon, johon tuo viite osoittaa? Voit sitten määritellä luokkaan metodin, joka palauttaa viitteen tuohon taulukkoon, jos sitä muidenkin luokkien olioiden pitää päästä käpistelemään.

tkok [29.01.2009 15:42:54]

#

Päärynämies kirjoitti:

Ihan selville en nyt päässyt mikä on se haluttu lopputulos. Ratkaisuksi ei käy, että luot määrittelet viitteen tuohon taulukkoon jonkun luokan jäseneksi, luokan konstruktorissa sitten luot haluamasi kokoisen taulukon, johon tuo viite osoittaa? Voit sitten määritellä luokkaan metodin, joka palauttaa viitteen tuohon taulukkoon, jos sitä muidenkin luokkien olioiden pitää päästä käpistelemään.

Hmm, en oikeen ymmärtänyt. Mutta siis tälläisen haluan:

1, Taulukon jota kaikki metodit ohjelmassani voivat käyttää
2, Käyttäjä voi antaa taulukon koon ohjelman alussa

Sami [29.01.2009 16:38:06]

#

public class Foo {
  public static void main(String[] argh) {
    Bar.asetaTaululleKoko(17);

    Bar.taulu[6] = 57;
    Bar.taulu[12] = 3;
    Bar.taulu[13] = -22;
  }

  public static void foo() {
    System.out.println(Bar.taulu[6]);
  }
}

public class Bar {
  public static int[] taulu;

  public static void asetaTaululleKoko(int koko) {
    taulu = new int[koko];
  }
}

Nyt Bar-luokassa oleva muuttuja taulu on määritelty luokkamuuttujaksi (static) kuin myös asetaTaululleKoko, jolloin nämä ovat sidottu luokkaan, eikä mihinkään siitä luotuun olioon.

Päärynämies [29.01.2009 16:40:49]

#

Ilmeisesti siis haluat, että taulukkosi näkyy jokaiselle metodille jokaisessa luokassa. Javassa ei ole samanlaisia globaaleita muuttujia käytössä kuin esim. C++:ssa on, joten suoraan tuollaista et saa toteutettua. Mahdotontahan tuo ei ole, mutta parempi ratkaisukin on luultavimmin olemassa. Kerrohan vähän lisää mitä ohjelman on tarkoitus tehdä ja miten toimia, niin voidaan yhdessä miettiä sille jokik kiva luokkarakenne. Sinulle ei ilmeisesti vielä täysin selvä ole tuo Javan luokka-ajattelu.

Tosin, jos välttämättä haluat, että jokainen luokkasi näkee saman taulukon jäsenenään, niin periyttämällä tuo onnistuu. Väsäsin ajankuluksi tässä koodiakin, joka demostroi tuota ratkaisua. Huomaat varmaan itsekin sen huonot puolet. Tuossa siis tosiaan luokkista Ali ja Baba luodut oliot kaikki viittaavat samaan taulukkoon.

Saman tulostusfunktion määrittely molemmissa Yli -luokasta perityttevissä luokissa on vain demostroimassa, että siihen muuttujaan tosiaan päästään käsiksi. Lisäksi yleisesti parempi olisi ollut tehdä vain metodi, joka palauttaa tuon taulukon koon ja kaikki tulostus sitten hoidetaan main -funktiossa, mutta tulipa nyt tehtyä noin. Jos tuo main -funktio vaikka näyttäisi kivemmalta noin, jos jotain tekosyytä pitää väkisin sille keksiä.

Edittiä: Pieniä virheitä koodissa oli. Ja tosiaan saavutettaan aikalailla sama mitä Sami tuossa ylhäällä demonstroi. Erona, että nyt tuo taulukko saadaan noiden luokkien jäseneksi eikä sijaitse omassa luokassaan.

class Yli{

    protected static int[] taulukko;

    public Yli(){

    }

    public Yli(int koko){
        taulukko = new int[koko];
    }
}

class Ali extends Yli{

    public Ali(){

    }

    public Ali(int a){
        super(a);
    }

    public void tulostaTaulukonKoko(){
        try {
            System.out.println("Taulukon koko on: " + taulukko.length);
        } catch (Exception e) {
            System.out.println("Tapahtui virhe!");
        }
    }
}

class Baba extends Yli{

    public Baba(){

    }

    public Baba(int a){
        super(a);
    }

    public void tulostaTaulukonKoko(){
        try {
            System.out.println("Taulukon koko on: " + taulukko.length);
        } catch (Exception e) {
            System.out.println("Tapahtui virhe!");
        }
    }
}

public class Taulukko {

    public static void main(String args[]){
        System.out.println("-new Ali()");
        Ali a = new Ali();
        a.tulostaTaulukonKoko();

        System.out.println("-new Ali(199)");
        Ali b = new Ali(199);
        a.tulostaTaulukonKoko();

        System.out.println("-new Ali(200)");
        Ali c = new Ali(200);
        a.tulostaTaulukonKoko();

        System.out.println("-new Ali()");
        Ali d = new Ali();
        a.tulostaTaulukonKoko();

        System.out.println("-new Baba()");
        Baba barbaba = new Baba();
        barbaba.tulostaTaulukonKoko();
        a.tulostaTaulukonKoko();

        System.out.println("-new Baba(300)");
        Baba alibaba = new Baba(300);
        a.tulostaTaulukonKoko();
    }
}

tkok [29.01.2009 16:56:06]

#

Sami kirjoitti:

public class Foo {
  public static void main(String[] argh) {
    Bar.asetaTaululleKoko(17);

    Bar.taulu[6] = 57;
    Bar.taulu[12] = 3;
    Bar.taulu[13] = -22;
  }

  public static void foo() {
    System.out.println(Bar.taulu[6]);
  }
}

public class Bar {
  public static int[] taulu;

  public static void asetaTaululleKoko(int koko) {
    taulu = new int[koko];
  }
}

Nyt Bar-luokassa oleva muuttuja taulu on määritelty luokkamuuttujaksi (static) kuin myös asetaTaululleKoko, jolloin nämä ovat sidottu luokkaan, eikä mihinkään siitä luotuun olioon.

Varmaan tarkoitus että mainis lukee viel foo(); ? mut joo tämä näyttää juurisiltä mitä halusin. Tai ainaskin on se minkä näistä tajuan parhaiten.

tsuriga [29.01.2009 17:42:17]

#

Kuvaukseen

tkok kirjoitti:

tälläisen haluan:

1, Taulukon jota kaikki metodit ohjelmassani voivat käyttää
2, Käyttäjä voi antaa taulukon koon ohjelman alussa

suosittelisin mieluummin olioratkaisua staattisten muuttujien sijaan.

public class ArrayObjects
{
    public static void main(String[] argh)
    {
        Foo foo1 = new Foo(10);
        Foo foo2 = new Foo(20);
    }
}

class Foo()
{

    protected int[] bar;

    public Foo(int size)
    {
        bar = new int[size];
    }

}

Nyt ei mitään väläyttävää argumenttia kyllä asian tiimoilta valitettavasti oikein löydy. Ensimmäisenä tulee mieleen tilanne, kun tahdotaan useampi olio ja eri kokoisia taulukoita. Toisekseen staattisuudessa uidaan hieman olioiden käyttötarkoitusta vastaan.

Ps. Ja näitä asioita testaillessa ja päähän hakatessa käykin sitten hyvin ilmi, miksi Javan koodaajat viittaavat argumenttitaulukkoon joskus nimellä argh ;).

Liittyen globaaliuteen, The Clean Code Talks - "Global State and Singletons"

Mod. korjasi kooditagit. Ei voi sulkea eri tagilla kuin avaa, eikö niin?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta