Ciao a tutti, volevo sapere se in una classe che ha solo metodi statici, posso fare a meno di inserire il costruttore.
Ciao a tutti, volevo sapere se in una classe che ha solo metodi statici, posso fare a meno di inserire il costruttore.
Una classe ha sempre almeno 1 costruttore! Se non è il programmatore a definirne almeno 1, è il compilatore che ne inserisce uno di "default". Se vuoi che la classe non sia istanziabile (perché in un caso come il tuo ha solo metodi statici tipicamente di "utilità") allora metti esplicitamente un costruttore dichiarato private.Originariamente inviato da Lucked
Ciao a tutti, volevo sapere se in una classe che ha solo metodi statici, posso fare a meno di inserire il costruttore.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
e se non metto il costruttore e lascio quello di default, che tanto non userò mai, che ne pensi?..![]()
Il costruttore di "default" ha 3 caratteristiche: non ha argomenti, fa una invocazione super() (senza argomenti ovviamente), ha lo stesso livello di accesso della classe.Originariamente inviato da Lucked
e se non metto il costruttore e lascio quello di default, che tanto non userò mai, che ne pensi?..![]()
Se la classe è public, avresti un costruttore public. Quindi la classe è istanziabile da chiunque. Serve? Se no .... quale è il problema a mettere un semplice: private TuaClasse() { }
?
E' poi quello che fanno classi con soli metodi statici come java.lang.Math e altri.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ok grazie
Un altra possibilità se vuoi una classe NON istanziabile che contiene solo metodi statici oppure metodi non direttamente accessibili da un oggetto istanziato (per il semplice fatto che NON potrai istanziare oggetti in questo caso).. è quello di mettere la classe come abstract.. esempio:
Per accedere a printStatic ti basterà fare ClasseNonIstanziabile.printStatic();codice:public abstract class ClasseNonIstanziabile { public static void printStatic(){ System.out.println("questo è un metodo statico"); } public void printNormal(){ System.out.println("questo è un metodo normale"); } }
Per accedere a printNormal invece dovrai prima farti una sottoclasse che estende ClasseNonIstanziabile e poi da li potrai richiamarlo da un oggetto istanziato da questa tua sottoclasse.
Ma sarebbe comunque estendibile (e comunque sarebbe poco logico nell'ottica OOP .... l'obiettivo di una classe abstract tipicamente è quello di essere estesa!).Originariamente inviato da rikytheblack
è quello di mettere la classe come abstract..
Un costruttore private assicura non istanziabilità e non estendibilità!
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Queste penso siano scelte implementative che dipendono dalle sue specifiche necessità in base a come ha organizzato il codice (che io non conosco).. siccome lui richiedeva se una classe che contiene solo metodi statici possa NON avere il costruttore (vale a dire NON essere istanziabile) la risposta che mi è venuta più immediata è mettere la classe come abstract e non curarsi più del costruttore dato che non deve esserci in una classe abstract.. mentre da essa è possibile chiamare qualsiasi metodo statico.Originariamente inviato da andbin
Ma sarebbe comunque estendibile (e comunque sarebbe poco logico nell'ottica OOP .... l'obiettivo di una classe abstract tipicamente è quello di essere estesa!).
Un costruttore private assicura non istanziabilità e non estendibilità!
Daccordissimo sul fatto che tipicamente nella programmazione ad oggetti una classe di questo tipo è fatta per essere estesa, ma queste sono scelte implementative.. l'idea che hai suggerito di mettere il costruttore come private funziona benissimo.. io volevo solo metterlo al corrente di questa seconda possibilità.
Una classe abstract non è diversa da altre classi ... anche qui ha sempre comunque almeno 1 costruttore, esplicito o implicito (quello di "default").Originariamente inviato da rikytheblack
dato che non deve esserci in una classe abstract..
No, non è questione di "scelta". Se si vuole fare una classe che non sia istanziabile (dall'esterno, chiaramente) l'unico "idioma" sensato è il costruttore privato! (Da Effective Java di Joshua Bloch, Item 4: Enforce noninstantiability with a private constructor)Originariamente inviato da rikytheblack
ma queste sono scelte implementative..
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
hai ragione dovevo dire "può non esserci scritto esplicitamente" il costruttore..
Il motivo per cui ho detto questa possibilità è che la NON estendibilità NON era nelle sue richieste iniziali...
ovvero se lui volesse una classe con soli metodi statici ma potrebbe in futuro pensare ad un eventuale estensione di quella classe per usare altri metodi NON statici l'idea della classe abstract funziona. Se invece lui vuole una classe che assicuri anche la NON estendibilità allora è giusta la tua soluzione.. ovviamente l'unico che può sapere questo è lui in base alle sue esigenze..
e nei suoi post NON ha specificatamente espresso il desiderio di una classe NON estendibile.. se l'avesse richiesto non avrei proposto la soluzione della classe abstract.