Newsgroup: it.comp.java
Titolo: Singleton o classe statica?

Salve a tutto il newsgroup,
devo realizzare una factory per DAO..... ho visto due approcci:
1) pattern singleton
2) classe con metodi statici
Dettaglio gli approcci:
1) PATTERN SINGLETON
public class DaoFactory {
        // Istanza del Singleton
        private static DaoFactory instance = null;
        // Costruttore privato (pattern Singleton)
        private DaoFactory() { }
        // Metodo getInstance (pattern Singleton)
        public static synchronized DaoFactory getInstance() {
           if (instance == null)
              instance = new DaoFactory();
           return instance;
        }
        metodiXXXDAO
}
2) Classe con metodi statici
public class DaoFactory {
        metodiXXXDAO STATICI
}
LATO CLIENT, nel primo caso devo recuperare l'istanza (unica) della
DAOFactory e poi richiamre il metodo...nel secondo caso è sufficente fare
DaoFactory.getXXXDAO().....
Quali sono le differenze tra i due approcci? Perchè dovrei usare il primo?
grazie

 ha scritto nel messaggio 
news:FqHOd.25349$lB4.6...@twister1.libero.it...



In entrambi i casi avresti lo stesso tipo di vantaggi e svantaggi, ma la 
via del singleton è sicuramente più pulita e object oriented.
I vantaggi penso li sappia pure tu, ecco invece un paio di trabocchetti 
che un tale approccio riserva:
- se hai più class loader che interagiscono in una gerarchia o 
parallelamente potresti trovare delle brutte sorprese, tipo classi che 
vengono ri-caricate e quindi ri-inizializzate, con conseguenze che puoi 
ben immaginare: memory leak, apparizioni, sparizioni e magie varie delle 
variabili statiche...
- attento agli accessi concorrenti!!! Possono diventare sorgente di bug 
inaspettati (se non sincronizzati) o un collo di bottglia (se...troppo 
sincronizzati)
Soprattutto quando ci sono di mezzo application server, JDBC e risorse 
"esose" questi problemi si fanno sentire eccome... A tal proposito, mi 
piacerebbe sentire come gli altri del NG risolvono questi problemi.
così gli rubiamo le idee  :)
cià
-- 
http://www.jroller.com/page/megadix/
http://megadix.users.mcs2.netarray.com/


I singleton io non li uso mai in scrittura, non credo riesci a rimanere j2ee
se lo fai
la strada corretta credo che dovrebbe essere quella di registrare la classe
al JNDI
e lavorarci su facendo attento a sincronizzare
comunque non lo ho mai fatto
+ grezzo sarebbe usare il DB
We Dix, e' da un pezzo che non ti leggo.
Sono tornato fisso a Milano.
Sono in una ottima azienda, forse la migliore anche se forse e' esagerato,
sembra + di essere in un laboratorio di sperimentazione tecnologica di quasi
matti .
Nicola
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 sincronizzati)
Allora scusa non conviene utilizzare una classe con metodi statici?
Tra l'altro è un approccio che già utilizzo per classi tipo SQLUtils,
DateUtils, StringUtils, ...
che posso richiamare semplicemente (tipo
SQLUtils.commitAndCloseConnection(), DAteUtils.getCurrentDate(), ...)
Per le factory dei DAO ho trovato molti esempi con pattern singleton...c'è
qualche motivo particolare o solo pulizia formale?
Con le classi che hanno metodi statici ci sono i problemi a cui accennavi tu
(sincronizzazione, memory leak, class loader ...)?
Grazie
ciao


mmmh...depende !!
Io comunque non mi fido di nessuno, soprattutto di me stesso, e fare 
tutti metodi statici ti porta inevitabilmente ad uno "sparpagliamento" 
del codice:
- creazione delle connessioni JDBC
- gestione degli errori
- altro ?
con il rischio di commettere dei piccoli (e bast...ehm subdoli) errori.
Io farei/faccio così:
- creo una classe "vera", da istanziare e configurare per benino
- ci pensa il "container" a configurare una/più istanze: può essere un 
EJB container, un Servlet Engine, il main() dell'applicazione; 
l'importante è che qualcuno lo faccia ;)
- chi è autorizzato ad eseguire delle query riceva un'istanza 
correttamente "massaggiata" di questa classe
In questo modo puoi configurare il sistema per operare su più database, 
con diverse politiche di locking, gestori della persistenza e bla bla bla
buon divertimento :) e facce sapé


 buon divertimento :) e facce sapé
Tendenzialmente sto pensando di fare classi con metodi statici per DateUtil
e StringUtil
mentre penso di fare una factory con pattern singleton per i getXXXDAO.....
Quanto all'utilizzo di classi con metodi statici considera che anche nel
pacchetto
http://jakarta.apache.org/commons/dbutils/
  c'è una classe statica DBUtils
con le più
comuni operazioni su DB.
Ciao

 
Bene, il punto è proprio questo: per le operazioni comuni va benissimo 
usare dei metodi statici, anzi è molto comodo e ti risparmia un sacco di 
tempo.
Però per quello che riguarda la gestione delle risorse disponibili 
(connessioni & datasource, JNDI, classi proxy per accedere a servizi 
tipo EJB o JMS ecc) è meglio l'approccio che ti dicevo.
Belline le DBUtils, in ogni progetto in cui ho lavorato c'era (e c'è) 
sempre qualcosa di simile, magari con un nome diverso ma i metodi quasi 
uguali...a riprova della loro grande utilità!!
Anzi, adesso me le scarico e le uso nel progettino per l'università...se 
me le fanno usare...(ssshh non ditelo a nessuno!!)


 comuni operazioni su DB.
Ciao, non conosco i requisiti della tua applicazione verso la base dati, 
pertanto non mi permetto di instradarti in una direzione che potrebbe risultare 
troppo onerosa in termini di ore di lavoro, ma in seguito ad una recente 
esperienza ti consiglierei di analizzare se sia il caso o meno di pensare ad un 
framework che ti possa facilitare la vita.
Ho da poco terminato lo sviluppo di un progetto (web application) per il quale 
ho sviluppato il DAO utilizzando l'approccio Statement/PreparedStatement: il 
risultato è stato IMHO deludente ed ho praticamente riscritto uno dei tanti 
motori di persistenza che avrebbero fatto al caso mio.
Se avessi usato Jakarta OJB, che conosco in maniera sufficiente, avrei 
sicuramente risparmiato tempo e guadagnato ore di sonno, mea culpa per non aver 
insistito in fase di analisi.
Ciao e buon lavoro.
-- 
Elimina tutti gli MP3 per rispondermi

 
Attenzione [SUPER OT]
Guarda chi si vede, J2EE Nicz !
Ma ce l'hai o no una email fissa ? Dai mandami un messaggio da lì (cerca 
nei siti sotto per il mio indirizzo) che ci facciamo un mojito...virtuale!
[FINE OT]


 Ciao e buon lavoro.
Avevvo valutato framework tipo Hibernate, iBatis, ecc...
In realtà a me non mi interessa la persistenza, ma solo un pattern per
l'accesso ai dati: credo di cavarmela con DAO + una DbUtils
grazie
ciao