Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76

    cosa significa questa "forma" implicita? static {

    Ciao a tutti,
    mi sono imbattuto in un esempio online con la seguente forma implicita.

    codice:
        private static Connection con = null;
        
        static { //<<---- versione implicita di????
            try {  
                Class.forName(DRIVER);  
                con = DriverManager.getConnection(CONNECTION_URL,USERNAME,PASSWORD);  
            }catch(Exception e){}
        }  
    
        public static Connection getCon() {
            return con;  
        }
    Cosa significa e come si utilizza: static { ?

    sembrerebbe che in automatico (sulla new? sulla get?) inizializzi la variabile statica "con" come definito all'interno delle graffe, un "auto-set"...

    il riconoscimento "automatico" della variabile a cui si riferisce è posizionale? come si utilizza nel caso di più variabili?

    Grazie in anticipo...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    Cosa significa e come si utilizza: static { ?
    È uno static initialization block (o detto anche static init block). È un blocco di codice che viene eseguito mentre la JVM sta eseguendo la inizializzazione della classe e in particolare mentre sta eseguendo la inizializzazione dei campi static.
    Pertanto viene eseguito 1 volta sola. NON ad ogni creazione di una istanza della classe.

    Si contrappone agli instance initialization block che è sempre un blocco { } allo stesso livello dei metodi ma senza lo static e che viene eseguito mentre l'oggetto viene inizializzato.
    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
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    È uno static initialization block (o detto anche static init block). È un blocco di codice che viene eseguito mentre la JVM sta eseguendo la inizializzazione della classe e in particolare mentre sta eseguendo la inizializzazione dei campi static.
    Pertanto viene eseguito 1 volta sola. NON ad ogni creazione di una istanza della classe.

    Si contrappone agli instance initialization block che è sempre un blocco { } allo stesso livello dei metodi ma senza lo static e che viene eseguito mentre l'oggetto viene inizializzato.
    Ok grazie mille...

    qundi l'associazione del blocco alla variabile è posizionale???

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Mrk31 Visualizza il messaggio
    qundi l'associazione del blocco alla variabile è posizionale???
    Se uno static init block deve inizializzare una variabile "di classe" (static), la variabile deve essere dichiarata prima del blocco. (in realtà , non è sempre così, ci sono altre regole che non ti ho detto).
    EDIT: mi pareva di ricordare così ... ma una prova veloce con JDK 7 mi ha confuso un attimo. Dovrei andare a rivedere le regole e provare con JDK vecchi. Comunque queste sono davvero super-finezze.

    Comunque prova:

    codice:
    public class Prova {
        static {
            System.out.println("static init block");
        }
    
        {
            System.out.println("instance init block");
        }
    
        public Prova() {
            System.out.println("costruttore");
        }
    
        public static void main(String[] args) {
            System.out.println("----main----");
            new Prova();
            new Prova();
        }
    }

    Nota come lo static init block viene addirittura eseguito PRIMA che il main venga invocato!!
    Ultima modifica di andbin; 26-04-2016 a 12:51
    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 L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ok, ora mi sono ricordato, mi ricordavo la regola del forward reference.
    Lo segno qui, così può essere utile:

    Questo è legale e corretto:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = 10;
            svar2 = 20;
        }
    
        private static int svar2;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    Stampa 10 e 20.

    Se però svar2 ha una inizializzazione:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = 10;
            svar2 = 20;
        }
    
        private static int svar2 = 100;    // Inizializzazione
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    allora l'assegnamento svar2 = 20; è inutile, poiché l'inizializzazione a 100 avviene comunque DOPO. Pertanto stampa 10 e 100.


    Quello che è illegale (e dà errore) è un forward reference (non qualificato):

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = svar2;
        }
    
        private static int svar2 = 10;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    Su svar1 = svar2; il javac segnala l'errore "illegal forward reference". Ovvero così non può accedere ad una variabile che è testualmente dopo.

    Se però qualifichi l'uso di svar2 con il nome della classe:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = Prova.svar2;   // svar2 qualificato
        }
    
        private static int svar2 = 10;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }
    Allora per il compilatore è lecito e compila. Ma poi a runtime a svar1 viene assegnato 0, perché in quel momento svar2 è ancora a 0, la inizializzazione a 10 avverrà solo DOPO.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ok, ora mi sono ricordato, mi ricordavo la regola del forward reference.
    Lo segno qui, così può essere utile:

    Questo è legale e corretto:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = 10;
            svar2 = 20;
        }
    
        private static int svar2;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    Stampa 10 e 20.

    Se però svar2 ha una inizializzazione:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = 10;
            svar2 = 20;
        }
    
        private static int svar2 = 100;    // Inizializzazione
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    allora l'assegnamento svar2 = 20; è inutile, poiché l'inizializzazione a 100 avviene comunque DOPO. Pertanto stampa 10 e 100.


    Quello che è illegale (e dà errore) è un forward reference (non qualificato):

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = svar2;
        }
    
        private static int svar2 = 10;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }

    Su svar1 = svar2; il javac segnala l'errore "illegal forward reference". Ovvero così non può accedere ad una variabile che è testualmente dopo.

    Se però qualifichi l'uso di svar2 con il nome della classe:

    codice:
    public class Prova {
        private static int svar1;
    
        static {
            svar1 = Prova.svar2;   // svar2 qualificato
        }
    
        private static int svar2 = 10;
    
        public static void main(String[] args) {
            System.out.println(svar1);
            System.out.println(svar2);
        }
    }
    Allora per il compilatore è lecito e compila. Ma poi a runtime a svar1 viene assegnato 0, perché in quel momento svar2 è ancora a 0, la inizializzazione a 10 avverrà solo DOPO.
    Grazie mille!!!
    Mmolto esaustivo ed interessante, grazie ancora....

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.