Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    classe con metodi statici

    Ciao a tutti, volevo sapere se in una classe che ha solo metodi statici, posso fare a meno di inserire il costruttore.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: classe con metodi statici

    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.
    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    e se non metto il costruttore e lascio quello di default, che tanto non userò mai, che ne pensi?..

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Lucked
    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.
    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ok grazie

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

    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 printStatic ti basterà fare ClasseNonIstanziabile.printStatic();
    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.

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da rikytheblack
    è quello di mettere la classe come abstract..
    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à!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    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à!
    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.

    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à.

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da rikytheblack
    dato che non deve esserci in una classe abstract..
    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
    ma queste sono scelte implementative..
    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)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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

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 © 2026 vBulletin Solutions, Inc. All rights reserved.