PDA

Visualizza la versione completa : [Java] creazione oggetto a partire da stringa


Lucis
31-07-2003, 17:29
Ho definito una classe astratta Oggetto e devo definire alcune classi concrete che estendono Oggetto: diciamo Tavolo, Sedia e Divano.

Le informazioni riguardanti le istanze di tali oggetti sono in un db in una tabella tipo:

oggetti(id, tipo, dimx, dimy, dimz)

ad es:

12,"divano",250,100,90
13,"sedia",60,130,60
etc...

Durante l'inizializzazione la mia applicazione deve inserire in una List tali oggetti. Avevo in mente di fare in questo modo:



[...]
List ogg = new LinkedList();
ResultSet rs = st.executeQuery("select * from oggetti");
while (rs.next()) {
Oggetto o = null;
String tipo = rs.getString("tipo");
if (tipo.equals("divano")) {
o = new Divano(rs.getInt("id"),rs.getInt("dimx"),rs.getInt("dimy"),rs.getInt("dimz"));
} else if (tipo.equals("sedia")) {
o = new Sedia(rs.getInt("id"),rs.getInt("dimx"),rs.getInt("dimy"),rs.getInt("dimz"));
} else if (tipo.equals("tavolo")) {
o = new Tavolo(rs.getInt("id"),rs.getInt("dimx"),rs.getInt("dimy"),rs.getInt("dimz"));
}

if (o != null) {
ogg.add(o);
}
}
rs.close();
[...]


ma poi ripensandoci non mi sembra una bella idea: i tipi di oggetti (e rispettive classi) saranno moltissimi e ogni volta non posso stare ad aggiungere un else if.

possibile specificare dinamicamente la classe di un oggetto per evitare gli else if? Potrei ad esempio memorizzare il nome della classe voluta nel campo tipo della tabella ("Divano","Sedia",etc)...

Ciao e grassie ^___^

dokk
31-07-2003, 19:06
Originariamente inviato da Lucis
Ho definito una classe astratta Oggetto e devo definire alcune classi concrete che estendono Oggetto: diciamo Tavolo, Sedia e Divano.

Le informazioni riguardanti le istanze di tali oggetti sono in un db in una tabella tipo:

oggetti(id, tipo, dimx, dimy, dimz)

ad es:

12,"divano",250,100,90
13,"sedia",60,130,60
etc...

Durante l'inizializzazione la mia applicazione deve inserire in una List tali oggetti. Avevo in mente di fare in questo modo:



[...]
List ogg = new LinkedList();
ResultSet rs = st.executeQuery("select * from oggetti");
while (rs.next()) {
Oggetto o = null;
String tipo = rs.getString("tipo");
if (tipo.equals("divano")) {
o = new Divano(rs.getInt("id"),rs.getInt("dimx"),rs.getInt("dimy"),rs.getInt("dimz"));
} else if (tipo.equals("sedia")) {
o = new Sedia(rs.getInt("id"),rs.getInt("dimx"),rs.getInt("dimy"),rs.getInt("dimz"));
} else if (tipo.equals("tavolo")) {
o = new Tavolo(rs.getInt("id"),rs.getInt("dimx"),rs.getInt("dimy"),rs.getInt("dimz"));
}

if (o != null) {
ogg.add(o);
}
}
rs.close();
[...]


ma poi ripensandoci non mi sembra una bella idea: i tipi di oggetti (e rispettive classi) saranno moltissimi e ogni volta non posso stare ad aggiungere un else if.

possibile specificare dinamicamente la classe di un oggetto per evitare gli else if? Potrei ad esempio memorizzare il nome della classe voluta nel campo tipo della tabella ("Divano","Sedia",etc)...

Ciao e grassie ^___^
mmmm... con la "reflection" dovresti riuscirci! Ti permette di instanziare classi senza che tu debba conoscerle prima, a partire da un stringa... non ricordo bene, ma qualcosa del tipo:
Class classe = Class.forName("NomeClasse");
o qualcosa del genere.. informati sulla reflection comunque!

Lucis
31-07-2003, 19:36
bene, un inizio :smack:, tnx.
In effetti la mia connessione al db ha il comando
Class.forName("com.mysql.jdbc.Driver");
che mi ispirava abbastanza.

Ora consulto il mio tomone su Java e vediamo che ne viene fuori.

Se avete suggerimenti pi precisi sono tutt'orecchi!!!
Grazie dokk!

dokk
31-07-2003, 20:14
Originariamente inviato da Lucis
bene, un inizio :smack:, tnx.
In effetti la mia connessione al db ha il comando
Class.forName("com.mysql.jdbc.Driver");
che mi ispirava abbastanza.

Ora consulto il mio tomone su Java e vediamo che ne viene fuori.

Se avete suggerimenti pi precisi sono tutt'orecchi!!!
Grazie dokk!
:ciauz:

Lucis
01-08-2003, 05:58
Uhm... sono giunto alla conclusione che la riflessione permette di avere informazioni riguardo una classe, ma non credo possa servire ad istanziare oggetti a partire dal nome (String) della classe...

sob... :dh: :dh: :dh:

Qualcuno pu aiutarmi? Sarebbe davvero importante per me riuscire a risolvere questo problema...

dokk
01-08-2003, 09:10
Originariamente inviato da Lucis
Uhm... sono giunto alla conclusione che la riflessione permette di avere informazioni riguardo una classe, ma non credo possa servire ad istanziare oggetti a partire dal nome (String) della classe...

sob... :dh: :dh: :dh:

Qualcuno pu aiutarmi? Sarebbe davvero importante per me riuscire a risolvere questo problema...
perch no?
l'hai detto tu stesso:
Class.forName("com.mysql.jdbc.Driver");

Lucis
01-08-2003, 14:01
CE L'HO FATTA! :adhone:

La strada era giusta ^______^

Solo che ieri notte il mio volumone non mi ha aiutato molto, anzi...

Spulciando tra la documentazione (sempre sia lodata) sono riuscito a venirne fuori!!!

per chi pu interessare questo quello che ho cavato fuori:


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Riflessione {
public static void main(String[] args) {
try {
Class daCaricare = Class.forName("UnOggetto");
UnAltroOggetto uao = new UnAltroOggetto();

Class[] parametri = {uao.getClass()};

Constructor costruttore = daCaricare.getConstructor(parametri);
Object[] parametro = {uao};
UnOggetto o = (UnOggetto)costruttore.newInstance(parametro);
o.suona();

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}

class UnOggetto {
public UnOggetto(UnAltroOggetto u) {
}

public void suona() {
System.out.println("pepperep");
}
}


class UnAltroOggetto {
}

Grazie dokk per l'insistenza :p

dokk
01-08-2003, 14:15
Originariamente inviato da Lucis
Grazie dokk per l'insistenza :p
Prego! :)
Il giorno in cui ho scoperto e usato la Reflection... La Forza entrata in me! http://forum.html.it/forum/faccine/098.gif
scherzi a parte... una cosa spettacolare! :ciauz:

Loading