Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Java] creazione oggetto a partire da stringa

    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:

    codice:
    [...]
    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 ^___^
    SO: Debian Sarge kernel 2.6.11
    Lang: Java, C++, C

  2. #2

    Re: [Java] creazione oggetto a partire da stringa

    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:

    codice:
    [...]
    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!

  3. #3
    bene, è un inizio , 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!
    SO: Debian Sarge kernel 2.6.11
    Lang: Java, C++, C

  4. #4
    Originariamente inviato da Lucis
    bene, è un inizio , 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!

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

    Qualcuno può aiutarmi? Sarebbe davvero importante per me riuscire a risolvere questo problema...
    SO: Debian Sarge kernel 2.6.11
    Lang: Java, C++, C

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

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

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

    codice:
    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
    SO: Debian Sarge kernel 2.6.11
    Lang: Java, C++, C

  8. #8
    Originariamente inviato da Lucis
    Grazie dokk per l'insistenza
    Prego!
    Il giorno in cui ho scoperto e usato la Reflection... La Forza è entrata in me!
    scherzi a parte... è una cosa spettacolare!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.