[ anon315 @ 20.06.2006. 00:09 ] @
Pojavila mi se potreba za sledećim:

Imam mnogo objekata iste klase i za svaki od tih objekata treba da pozovem isti metod, a objekti su zgodno nazvani, npr:

Code:

obj1.metod();
obj2.metod();
obj3.metod();
...
objn.metod(); // Gde n može (i jeste) da bude veliki broj!


Po inerciji čoveku padne na pamet:

Code:

String s;
for(int i=1; i<=n; i++) {
     s="obj" + i;
     // I ŠTA SAD?
}


Dakle, imam ime objekta, ali kao string i sad je pitanje kako da na osnovu tog stringa dobijem referencu, da bih mogao da pozovem metodu...

Poz.
V
[ Branko Santo @ 20.06.2006. 04:55 ] @
Napravi listu sa svim objektima i onda kad treba da pozoves ti samo iteraturjes i pozivas metod.
[ logotet @ 20.06.2006. 08:01 ] @
Ja bih radije imao
Code:

Object[] obj = new Object[n]; // naravno stavis svoju klasu umesto Object
.
.
.// a u petlji pozivas
obj[i].metod();


A, ako bas hoces kako si resio onda pogledja java.lang.reflect paket i uopste procitaj nesto o "reflection".
Retko koristim, pa samo po secanju, islo bi otrpilike:

Code:

          Class c = Class.forName("TvojaKlasa");
           Method met = cls.getMethod("metoda");
           met.invoke(???);

pogledaj u API dokumentaciji tacne pozive, bas se i ne secam najbolje, a mrzi me da ceprkam.

Napomena: ako su ti objekti vec instancirani onda moras da imas niz, kolekciju ..., ne mozes ga naci po nazivu reference.
[ anon315 @ 20.06.2006. 10:44 ] @
Objekti su vec instancirani, a pravljenje kolekcije i dodavanje svih objekata u kolekciju, pa onda pozivanje preko iteriranja je u sustini jos glomaznije, zar ne? (jer moram prvo sve da ih dodam, a to mu dodje na isto)
[ milas @ 20.06.2006. 13:12 ] @
Ono sto ti hoces je da dobijes instance (objekte) neke klase koji su kreirani u virtuelnoj masini. To ne mozes uraditi sa refleksijama. Pogledaj uputstvo za Javinu virtuelnu masinu za resavanje tog problema.
[ anon315 @ 20.06.2006. 13:38 ] @
Uh, sad si mi bas pomogao
[ hyle @ 20.06.2006. 14:23 ] @
Lepo su ti ljudi rekli da koristiš niz. Ništa tu nije glomazno, čak je mnogo elegantnije da deklarišeš promenljive u jednoj liniji sa
Code:

   TvojaKlasa objekti[] = new TvojaKlasa[100];

nego da deklarišeš svaku promenljivu pojedinačno sa
Code:

   TvojaKlasa objekat1;
   TvojaKlasa objekat2;
   TvojaKlasa objekat3;
   ...
   TvojaKlasa objekat100;


Objekte možeš da iskreiraš u jednoj petlji, a ne da kreiraš svaki pojedinačno:
Code:

    for (int i = 0; i < 100; i++) {
        objekti[i] = new TvojaKlasa();
    }


Isto tako, tvoj metod možeš da pozivaš u petlji:
Code:

   for (int i = 0; i < 100; i++) {
      objekti[i].metod();
   }


Pretpostavljam da imaš neki ograničen broj promenljivih koje su ti potrebne pa si kreirao pojedinačne promenljive, recimo 30 komada. Šta ćeš raditi ako ti si ukaže potreba da imaš 1000 ili milion različitih objekata? Pravićeš promenljive?

Nije mi jasno šta ti u ovakvom pristupu ne odgovara i zbog čega je bolje da imaš gomilu promenljivih umesto jednog niza?
[ boorchoo @ 20.06.2006. 15:12 ] @
Nema ti spasa. Koristi mapu (npr. HashMap) sa stringovima kao ključevima. Bedara je što ćeš morati da je puniš već kreiranim objektima.
[ mucky @ 20.06.2006. 15:28 ] @
Moram da primetim kako je suludo imati promenljive sa nazivima
objekat1, objekat2, objekat3, ... , objekatN
a ne koristiti niz :)

Mislim da moras da imas izuzetno dobar razlog zbog kog ovako radis,
jer u suprotnom slucaju za ovakvu realizaciju ima samo jedan naziv:
izuzetno lose programiranje :)
[ degojs @ 20.06.2006. 16:25 ] @
Citat:
Vanja:
Objekti su vec instancirani, a pravljenje kolekcije i dodavanje svih objekata u kolekciju, pa onda pozivanje preko iteriranja je u sustini jos glomaznije, zar ne? (jer moram prvo sve da ih dodam, a to mu dodje na isto)


Kada se dodaju objekti u kolekciju, ne dodaju se nikakve kopije objekata, već samo reference na postojeće objekte. Dakle, nema razloga da ne koristiš kolekcije.

Jednostavno, kako kreiraš objekte, odmah ih i dodaj u neku kolekciju.
[ uranium @ 20.06.2006. 17:09 ] @
Evo dopune rešenja koje je dao logotet:

Code:

class TvojaKlasa{
        public Nesto obj1;
        public Nesto obj2;
        .
        .
        public Nesto objn;
        . 
        .
        .
}


Code:

import java.lang.reflect.*;
.
.
.
        TvojaKlasa k=new TvojaKlasa();
        Class<?> c=Class.forName("TvojaKlasa");

        
        for(int i=1;i<=n;i++){
            Nesto x=(Nesto)c.getField("obj"+i).get(k);
            x.metod();
        }



[Ovu poruku je menjao uranium dana 20.06.2006. u 18:26 GMT+1]
[ milas @ 20.06.2006. 17:40 ] @
Ne, ne, ovo ne moze da se resi koriscenjem refleksija. Jedino je moguce resititi koriscenjem JVM TI agenta (native native). Funkcija je IterateOverInstancesOfClass:

http://java.sun.com/j2se/1.5.0...ml#IterateOverInstancesOfClass

Ovaj pristup bi radio da vezes sve instance odredjenog tipa koji hoces, i onda da pozoves GetObjectsWithTags da uzmes JNI referencu ka objektima. Mozes pokusati da vratis ovaj niz objekata tvom java kodu i onda da pozoves metod koji hoces.

Nadam se da ce ti ovo pomoci.
[ anon315 @ 20.06.2006. 18:04 ] @
Prvo, ne znam zasto tako agresivni stavovi, pogotovu od moderatora, al' nema veze...

Verovatno je to posledica cinjenice da nisam naglasio da objekte ne instanciram sam, jer u tom slucaju sigurno ne bih pravio n objekata rucno. Trik je u tome sto koristim NetBeansov GUI bilder (sto inace ne praktikujem) jer radim na jednom pozamasnom projektu, gde sam isprogramirao negde oko 60 svojih beanova, pa je ovako brze, jer ima mnogo da se crta. On sam instancira te objekte, a pritom zakljucava deo koda itd, itd..

U svakom slucaju, hvala svima na trudu.

1/100 gui-ja, svaka linijica itd. je jedan objekat...



Milas, pogledacu to sto predlazes, to mi trenutno deluje kao jedino moguce resenje u mom slucaju!

Poz.
V
[ hyle @ 20.06.2006. 23:22 ] @
Nisam imao nameru da zvučim agresivno, izvinjavam se ako je tako izgledalo

Na osnovu načina na koji si formulisao pitanje delovao si kao neko ko ne poznaje koncept nizova pa sam hteo svojim odgovorom da te nateram da porazmisliš o problemu i uvidiš prednost nizova.

Možda postoji neko ograničenje koje nisi izneo ali na osnovu stvari koje si rekao u prethodnim poruka tvoje rešenje mi sa programerske strane i dalje deluje dosta ružno...

Ako baš želiš na taj način da rešiš problem onda možeš da iskoristiš i predlog koji je dao Uranium.

Preko refleksije ne možeš da zahtevaš direktan pristupu promenljivoj pod određenim nazivom npr. "obj1" ali zato možeš da dođeš do promenljive ukoliko ona predstavlja atribut neke druge klase:
Citat:

Code:

class TvojaKlasa{
        public Nesto obj1;
        public Nesto obj2;
        .
        .
        public Nesto objn;
        . 
        .
        .
}



Za neku instancu klase TvojaKlasa bez problema možeš refleksijom da očitaš vrednosti njenih property-ja: obj1, ..., objN na način koji je Uranium predložio.
[ anon315 @ 21.06.2006. 00:21 ] @
Bas bih voleo da mi objasnis sta ti to i dalje deluje ruzno??? Mislim, volim da cujem kritike, ali argumentovane...

Prosto mi deluje neverovatno da ni moderator ne moze da shvati najprostiju stvar koju objasnjavam, dakle (milas je jedini skapirao):

Kada prevlacim binove automatski se instanciraju linije i posle pozicioniraju i tako dalje i to mi zavrsava posao. Ja ne mogu da promenim nacin rada gui bildera, a i ne znam zasto bih to radio. Da naknadno ubacujem u kolekciju je krajnje glupo jer to onda nije resen problem, isto bih morao 100 puta da pozivam nesto itd..

Uraniumovo resenje ne pije vodu, jer vec imam instancirane objekte, a iz same te klase (tj. jedne njene metode) gde se nalaze ti objekti moram da pozovem te metode...

Prosto ko pasulj, samo niko ne zna da resi problem i to je to...
[ anon315 @ 21.06.2006. 00:29 ] @
Alternativno resenje (koje sam vidjao u drugim projektima ovog tipa - naime, u pitanju je simalator procesora) je da sam bean ima i jednu referencu na drugi takav bean, pa se na taj nacin resavao problem, ali to nije ono sto ja ovde pitam...
[ degojs @ 21.06.2006. 01:21 ] @
Vanja, možda ovo može da ti pomogne:

NetBeans Quick Tip #23 - Changing Code in Blue Guarded Blocks

I noticed that some folks had a hard time finding out how to modify the blue, guarded code generated by Matisse. You can change this code from the Code tab in the component's properties. This winklet shows how to do it for constructors with parameters:

http://blogs.sun.com/roller/pa...netbeans_quick_tip_23_changing

Inače, bez ljutnje, ali zaista izgleda da stvari radiš totalno naopako. Ja lično neću da te ubeđujem :>

[Ovu poruku je menjao degojs dana 21.06.2006. u 02:38 GMT+1]
[ degojs @ 21.06.2006. 02:06 ] @
E da, imam još jedno pitanje koje možda može da ti pomogne: ne radim Javu sa te strane (GUI) ama baš nikako, ali zar nisu svi objekti (GUI elementi) već u nekoj kolekciji tipa (sad lupam): JPanel ima niz komponenti koje sadrži i prikazuje, itd? Nešto tipa:

Code:

.....
javax.swing.JPanel jp = (javax.swing.JPanel) mojPanel;
java.awt.Component[] c = jp.getComponents();

for( int i = 0; i< c.length; i++)
{
  javax.swing.JButton jb = (javax.swing.JButton) c[i];
  System.out.println( c[i].getText() );
}


Gde bi naravno u petlji samo proveravao da li je komponenta potrebnog tipa (instanceof)..

Ovaj gore kod kao izlaz kod mene daje:
Hello
Hello2

što odgovara onom što imam u dizajneru:





[Ovu poruku je menjao degojs dana 21.06.2006. u 03:34 GMT+1]
[ anon315 @ 21.06.2006. 07:44 ] @
Nisu Degojs...

Ok, nemam nameru da menjam definiciju promenljivih jer bih onda morao potpuno da izmenim i deo koda koji radi sa njima, a taj kod ima zilion linija po bloku...

You are missing the point!

Nebitno, hvala na paznji, dovidjenja...
[ ph4t @ 21.06.2006. 08:44 ] @
Citat:
milas: Ne, ne, ovo ne moze da se resi koriscenjem refleksija. Jedino je moguce resititi koriscenjem JVM TI agenta (native native). Funkcija je IterateOverInstancesOfClass:

http://java.sun.com/j2se/1.5.0...ml#IterateOverInstancesOfClass

Ovaj pristup bi radio da vezes sve instance odredjenog tipa koji hoces, i onda da pozoves GetObjectsWithTags da uzmes JNI referencu ka objektima. Mozes pokusati da vratis ovaj niz objekata tvom java kodu i onda da pozoves metod koji hoces.

Nadam se da ce ti ovo pomoci.


Ovo je po mom misljenju dosta ruzno rjesenje. Praviti agenta u C/C++ samo da bi rjesio ovaj problem? I onda mora jos posebno za svaki OS da kompajilra taj agent library.

[Ovu poruku je menjao ph4t dana 21.06.2006. u 09:54 GMT+1]
[ hyle @ 21.06.2006. 08:58 ] @
Nemoj se sada nervirati :)
Pa ovo ti je standardni problem koji se javlja ukoliko tražiš odgovor na forumu. Naravno da ne možeš u par redova precizno da definišeš problem, svako to protumači na svoj način i diskusija lako skrene.

U svakom slučaju, među odgovorima koje si dobio nalaze se 3 alternativna rešenja pa ti proceni da li ti nešto od toga odgovara.
(meni se čini da si se ti uhvatio za najgore rešenje od ta 3 ali to je tvoja stvar)

Srećan rad!
[ anon315 @ 21.06.2006. 10:36 ] @
Hvala :)

Da, najgore resenje (zato sam i trazio savet), ali i jedino realno u ovom slucaju, kako stvari stoje.

Mislim da je, generalno, potrebno pogledati i profil osobe koja pita nesto da bi se stekao makar neki utisak, pa i to uzeti u obzir prilikom odgovora ;) (da se moderatori ne bi mucili da objasnjavaju sta je to niz ljudima koji to vec znaju, npr. :P)

Tnx
V
[ degojs @ 21.06.2006. 17:28 ] @
Citat:
Nisu Degojs...


Kako nisu?

Koliko vidim, Netbeans baš u tom "zaključanom" kodu vrši ovo dodavanje "child" komponenti u neku kolekciju kod "roditelja"?

Možeš li da postaviš deo koda, posebno tog "zaključanog" što generiše NB i gde kažeš da vrši instanciranje tih tvojih binova?
[ anon315 @ 21.06.2006. 17:54 ] @
Pa Degojs, moze, ali onda bih morao za svako npr. linija.setbound da menjam u lista.bla.bla.setbounds itd. na taj nacin bih imao veci posao nego da rucno idem od jedan do n, kapiras?
[ degojs @ 21.06.2006. 18:54 ] @
Jok :)

Ne kapiram zašto ne možeš da u petlji prođeš kroz sve komponente na tom npr. JPanelu i pozoveš setbound samo za komponente koje su potrebnog tipa (nešto kao if ( x instanceof MojaKlasa) x.setbound ... ).

Otprilike onako kako sam ja u primeru gore pozvao .getText() u petlji za svako dugme na JPanelu. Mogao sam da imam 1 ili 1000 dugmića na formi.. ostaje 2 linije koda jer je u pitanju petlja.

Naravno, ja sam u tom primeru u dizajneru dodao 2 dugmića, pa sam i znao unapred kog tipa (JButton) će da budu, ali i da nisam znao jedan instanceof rešava dilemu..



[Ovu poruku je menjao degojs dana 21.06.2006. u 20:13 GMT+1]
[ anon315 @ 21.06.2006. 21:16 ] @
Problem je u tome sto je jedan signal sagradjen od vise horizontalnih i vertikalnih linija, pa se npr tamo neki signal sastoji od 4 linije, a drugi od 10, dakle ja ne treba da pozivam metodu za SVE, nego samo za grupacije koje cine jedan signal itd.
[ anon315 @ 21.06.2006. 21:18 ] @
Dakle, pomocu tvog koda bih dohvatio sve linije npr, ali ja ne treba za sve njih da zovem metodu, nego po nekom logickom redosledu, a to znaci da mi tvoje resenje ne bi pomoglo, kao ni instanceof itd...

Jel sad ok?
[ degojs @ 21.06.2006. 22:16 ] @
Pošto su u pitanju "ručno" urađeni binovi, sigurno možeš da svakom binu dodaš neko polje tipa:

private String tag;
...
public String getTag() { return this.tag; }
..
public void setTag( String tag ) { this.tag = tag; }

gde ovu vrednost možeš da postaviš u konstruktoru..

a onda u petlji samo proveravaš da li je to polje na vrednosti koja ti treba, nakon što si uradio proveru sa instanceof. Nešto tipa:

if ( x instanceof MojaKlasa )
if ( ((MojaKlasa)x).getTag().equals( "XYZ" )
x.metod();

sve to u petlji..

Najbolje bi bilo prethodno prebaciti reference u neku (sortiranu) Map-u gde bi onda jednostavno mogao da pozivaš metode objekata u određenom redosledu..

MADA, sve to je "štap i kanap": ako su ti objekti u različitim grupama, onda trebaš, za svaku grupu, da već imaš kolekciju (ili niz) koja sadrže reference na te objekte iz grupe. Objekti bi mogli sami da se dodaju u potrebnu kolekciju u konstruktoru.

Toliko od mene..


[Ovu poruku je menjao degojs dana 22.06.2006. u 05:47 GMT+1]
[ anon315 @ 22.06.2006. 10:37 ] @
Upravo tako!

Ali kada sam razmisljao da li da koristim to ili ovo moje "lose programersko resenje", ipak sam se odlucio za ovo poslednje, jer bih i za prvu varijantu za svaki bean morao u Netbeansu da mu setujem property kojoj grupi pripada, pored gore navedenog posla, sto mu kada se sabere dodje vise nego da radim ovako rucno ;)

Btw, izvinjavam se sto nisam bio precizan na pocetku i hvala svima na diskusiji!

Poz.
V

[Ovu poruku je menjao Vanja Petreski dana 22.06.2006. u 15:06 GMT+1]
[ anon315 @ 22.06.2006. 15:12 ] @
Problem resen na sledeci nacin:

Umesto da kucam:

Code:

        sigIRIF23_1.oboji(TestiranjeBlokova.IRIF1_bits[0]);
        sigIRIF23_2.oboji(TestiranjeBlokova.IRIF1_bits[0]);
        sigIRIF23_3.oboji(TestiranjeBlokova.IRIF1_bits[0]);
        sigIRIF23_4.oboji(TestiranjeBlokova.IRIF1_bits[0]);
        sigIRIF23_5.oboji(TestiranjeBlokova.IRIF1_bits[0]);
        sigIRIF23_6.oboji(TestiranjeBlokova.IRIF1_bits[0]);
        sigIRIF23_7.oboji(TestiranjeBlokova.IRIF1_bits[0]);


, da bih obojio samo jedan signal koji se sastoji od 7 linija u ovom slucaju, sada koristim:

Code:

Object[] sigIRIF23 = { sigIRIF23_1, sigIRIF23_2, sigIRIF23_3, sigIRIF23_4, sigIRIF23_5, sigIRIF23_6, sigIRIF23_7 };
akcija(sigIRIF23, TestiranjeBlokova.IRIF1_bits[0]);

, gde je akcija:

Code:

    private static void akcija(Object[] o, boolean sig) {
        for(int i=0; i<o.length; i++) {
            if(o[i] instanceof LinijaHor) {
                LinijaHor linH = (LinijaHor)o[i];
                linH.oboji(sig);
            }
            else if(o[i] instanceof LinijaVert) {
                LinijaVert linV = (LinijaVert)o[i];
                linV.oboji(sig);
            }
            else return;
        }
        
    }


Pozdrav!
[ hyle @ 22.06.2006. 18:56 ] @
Ne znam koji komponentu nasledjuju klase LinijaHor i LinijaVert, pretpostavljam da je JLabel ili nešto slično.

Ako uvedeš apstraktnu klasu LinijaApstr koja nasleđuje komponentu koju si koristio i ima metodu oboji(boolean sig), npr.
Code:

  public abstract class LinijaApstr extends JLabel {

    public abstract void oboji(boolean sig);

  }


i navedeš da tvoje klase LinijaHor i LinijaVert nasleđuju LinijaApstr onda ostatak koda može da izgleda ovako:
Code:

  LinijaApstr[] sigIRIF23 = { sigIRIF23_1, sigIRIF23_2, 
                                     sigIRIF23_3, sigIRIF23_4, 
                                     sigIRIF23_5, sigIRIF23_6, sigIRIF23_7 };
  akcija(sigIRIF23, TestiranjeBlokova.IRIF1_bits[0]);


gde je metoda akcija(LinijaApstr[], boolean) definisana na sledeći način:
Code:

  private static void akcija(LinijaApstr[] la, boolean sig) {
    for(int i=0; i < la.length; i++)
      la[i].oboji(sig);
  }

Na taj način bi upotrebom polimorfizma izbegao nepotrebno korišćenje instanceof operatora, kastovanje i grananje pomoću if naredbe.


Vidim da si se na kraju ipak odlučio za korišćenje niza, zbog čega si odustao od ideje da pristupaš instancama preko imena promenljive?
[ anon315 @ 22.06.2006. 19:06 ] @
Tako je, u medjuvremenu sam upravo to i uradio sa apstraktnom klasom etc. ;)

Na kraju sam pristupio ovom resenju jer ipak skracuje posao, ne mnogo (jer moram da pravim mnogo grupacija) , ali skracuje.

Mene je, prvobitno, interesovalo "kako dobiti referencu na instancirani objekat pomocu naziva objekta" jer bi onda resenje bilo jos krace (najkrace), dakle to je bila poenta mog pitanja, ali, ocigledno, to ne moze!
[ anon315 @ 22.06.2006. 19:13 ] @
Mada sad razmisljam, mozda cu ipak i vratiti resenje sa instanceof, jer cu, kasnije, imati potrebu da u akciji pozivam i neke metode nekih drugih klasa, na primer JLabel setText kako bih prikazao stanja magistrala i grupa linija, pa je mozda lepse da imam jednu metodu sa grananjem i instanceof gde pokrivam sve, nego vise takvih metoda bez ili jednu sa miksovanim grananjem po apstraktnim klasama, jer mi je brze da uradim tako nego da sada menjam sve beanove i saljem ponovo ljudima koji rade samnom u grupi kako bih postigao to o cemu pricas... ;)

Ali sada smo vec totalno otisli u offtopic (jel to pokriveno nekim vasim pravilnikom?) posto je gospodin moderator raspolozen za drzanje bazicnog Java kursa, danas na dnevnom redu - polimorfizam!

Jeeeeee :P

[Ovu poruku je menjao Vanja Petreski dana 22.06.2006. u 20:26 GMT+1]
[ hyle @ 22.06.2006. 19:51 ] @
Neće se ljudi ljutiti što smo otišli malo u offtopic.

Videli su svi da ti nisu bili jasni neki osnovni pojmovi pa će ovih par postova biti od koristi tebi i drugim početnicima.

Drago mi je što sam mogao da ti pomognem.