Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315

    variabili e metodi statici

    Se non ho capito male le variabili vengono dichiarate statiche nel momento in cui ho bisogno di una variabile che non sia condivisa da tutte le istanze di una classe (nel senso che ogni istanza ha una sua "versione" della variabile") ma che sia unica e che quindi ad ogni istanziazione di un nuovo oggetto non venga per così dire riazzerata.
    Non mi è chiaro però il perchè dovrei dichiarare un metodo come statico.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    Se non ho capito male le variabili vengono dichiarate statiche nel momento in cui ho bisogno di una variabile che non sia condivisa da tutte le istanze di una classe (nel senso che ogni istanza ha una sua "versione" della variabile") ma che sia unica e che quindi ad ogni istanziazione di un nuovo oggetto non venga per così dire riazzerata.
    I membri "di classe" (static) appartengono alla classe, non a ciascuna istanza (oggetto) della classe. Una variabile di classe quindi è "unica", indipendentemente da quanti oggetti della classe andrai ad istanziare.

    Nota tecnica: in realtà e per essere pignoli, nel concetto di unicità entra in gioco il classloader. Infatti è un classloader che carica la definizione di una classe. Se due classloader distinti caricano la stessa classe, si avranno due istanze di java.lang.Class distinte per quella classe e quindi per ciascuna ci saranno quei campi static distinti. È un concetto un po' avanzato ... magari dimentica per il momento questo paragrafo.

    Quote Originariamente inviata da newutente Visualizza il messaggio
    Non mi è chiaro però il perchè dovrei dichiarare un metodo come statico.
    In tutti i casi in cui il metodo non ha senso che sia invocato su uno specifico oggetto. Ad esempio:
    - metodi di "utilità" (es. i max, random, sin, ecc... di Math)
    - metodi "factory" (tipo es. getInstance)
    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 2014
    Messaggi
    315
    Grazie per la spiegazione.

    Per comprendere meglio posto una parte (una classe) di un esercizio che sto facendo:
    codice:
    public class Moneta 
    {
        public final static String VALUTA="EURO";
        private final int valore;
    
        public Moneta(int valore)
        {
            this.valore = valore;
            System.out.println("Creata " + getDescrizione());
        }
    
        public String getDescrizione()
        {
            String descrizione = "moneta da: " + formattaStringaDescrittiva(valore) + VALUTA;
            return descrizione;
        }
    
        private static String formattaStringaDescrittiva(int valore)
        {
            String stringa = " centesimi di ";
            if (valore == 1)
            {
                     stringa = " centesimo di ";
                        }
            else if (valore > 99)
            {
                stringa = " ";
                valore /= 100;
                            
            }
            return valore + stringa;
        }
    
        public int getValore()    
        {
                return valore;
        }
            
    }
    Mi è tutto chiaro tranne il perchè il metodo formattaStringaDescrittiva la soluzione lo riporta come statico. Stando al ragionamento fatto dovrebbe essere non statico visto che riguarda comunque ogni oggetto di tipo Moneta.



    p.s. se una variabile è dichiarata final è una costante? se si, non dovrebbe essere inizializzata? Mi riferisco a private final int valore;

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    final si può riferire a classe, membro, metodo, variabile locale.
    Quando lo riferisci a classe stai dicendo che la classe in questione non puoi estenderla, diciamo che la fai diventare costante non dando la possibilità di aggiungere/modificare funzionalità.
    Se ti riferisci ad un metodo, in maniera del tutto analoga, stai dicendo che escludi, per tale metodo, la possibilità di fare un override in una gerarchia di classi, ma in linea di principio la classe puoi ancora usarla come classe base.
    Se ti riferisci ad un membro/variabile locale, bisogna fare delle precisazioni: final static indica una costante e deve essere inizializzata contestualmente alla dichiarazione.

    Es. public final static Double PIGRECO = 3.14;

    indico un valore che non può essere modificato ed usando static sono costretta ad inizializzarlo (a conoscere il valore) in fase di compilazione.

    Attento che questo è lecito

    codice:
    public class Sample {
                    private final static int value = 5; 
            
            private final static int anotherValue = value;
    }
    visto che quando inizializzi anotherValue hai già specificato il valore di value.

    per i membri non statici invece final indica un valore che puoi inizializzare una sola volta:

    codice:
    class Sample {
            private final int val; 
            
            Sample (){
                val = 0;
            }
            
            private void method (final int value){
                final int val ; 
                if (value % 2 == 0){
                    val = 5; 
                }else {
                    val = 6; 
                }
                
            }
        }
    come puoi vedere indico che val non può essere modificato, o lo istanzio subito (come faccio per la costante) o lo faccio nel costruttore. Usare entrambi le soluzioni insieme è scorretto, o uno o l'altra.
    per i membri spesso l'inizializzazione la fai nel costruttore, perché stai dicendo che il riferimento è costante, il valore non lo conosci a priori e quindi lo deduci in fase di costruzione dell'oggetto.

    In maniera del tutto analoga per le variabili locali, guarda il metodo method, ti faccio vedere come posso dichiarare la variabile locale e istanziarla dopo, e la doppia assegnazione vale perché la faccio in un ramo if. L'importante è che non tenti di assegnare 2 volte il riferimento all'interno dello stesso blocco.
    Ultima modifica di valia; 11-11-2014 a 12:26
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Ok, quindi se c'è solo final in quel caso la costante non sono costretto a inizializzarla subito ma posso farlo anche nel costruttore (come nell'esercizio che ho postato), se invece c'è final static la costante sono costretto ad inizializzarla subito (come nel tuo primo esempio).

    Per quanto riguarda invece il metodo formattaStringaDescrittiva dell'esercizio? Perchè ha senso dichiararlo statico?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    perché è una utility (fa la formattazione).

    codice:
    privatestaticString formattaStringaDescrittiva(int valore)
        {
            String stringa =" centesimi di ";
            if(valore ==1)
            {
                     stringa =" centesimo di ";
                        }
            elseif(valore >99)
            {
                stringa =" ";
                valore /=100;
                            
            }
            return valore + stringa;
        }
    e soprattutto perché lavora su quello che tu dai in input e con variabili locali, non riferisce nessun membro di classe, quindi puoi considerarlo "generale", che si riferisce alla classe e non all'oggetto, e quindi dichiararlo statico.
    RTFM Read That F*** Manual!!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    quindi se un metodo lavora con variabili locali passate in input e non riferisce nessun membro (necessariamente di classe?) allora posso dichiararlo statico.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Nessun membro (uno statico puoi riferirlo), volendo puoi

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da newutente Visualizza il messaggio
    se invece c'è final static la costante sono costretto ad inizializzarla subito (come nel tuo primo esempio).
    Ni... si può usare un blocco di inizializzazione statica (che è un po' la stessa roba), ma è un dettaglio.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    ok.

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