123 votes

Java : Quand un bloc d'initialisation statique est-il utile ?

Quelle est la différence entre l'initialisation dans un bloc static

 public class staticTest {

    static String s;
    static int n;
    static double d;

    static {
        s = "I'm static";
        n = 500;
        d = 4000.0001;
    }
    ...

Et initialisation statique individuelle :

 public class staticTest {

    static String s = "I'm static";
    static int n    = 500;
    static double d = 4000.0001;

    ....

133voto

rich.okelly Points 24144

Un bloc d'initialisation statique permet une initialisation plus complexe, par exemple à l'aide de conditions :

 static double a;
static {
    if (SomeCondition) {
      a = 0;
    } else {
      a = 1;
    }
}

Ou lorsque plus qu'une simple construction est requise : lorsque vous utilisez un générateur pour créer votre instance, la gestion des exceptions ou un travail autre que la création de champs statiques est nécessaire.

Un bloc d'initialisation statique s'exécute également après les initialiseurs statiques en ligne, ce qui suit est valide :

 static double a;
static double b = 1;

static {
    a = b * 4; // Evaluates to 4
}

21voto

karan patel Points 417

Vous pouvez utiliser le bloc try/catch dans static{} comme ci-dessous :

 MyCode{

    static Scanner input = new Scanner(System.in);
    static boolean flag = true;
    static int B = input.nextInt();
    static int H = input.nextInt();

    static{
        try{
            if(B <= 0 || H <= 0){
                flag = false;
                throw new Exception("Breadth and height must be positive");
            }
        }catch(Exception e){
            System.out.println(e);
        }

    }
}

PS : Référé à partir de ceci !

20voto

gawi Points 5073

Une utilisation typique :

 private final static Set<String> SET = new HashSet<String>();

static {
    SET.add("value1");
    SET.add("value2");
    SET.add("value3");
}

Comment feriez-vous sans initialiseur statique?

12voto

Paul Bellora Points 26524

La gestion des exceptions lors de l'initialisation est une autre raison. Par example:

 static URL url;
static {
    try {
        url = new URL("https://blahblah.com");
    }
    catch (MalformedURLException mue) {
        //log exception or handle otherwise
    }
}

Ceci est utile pour les constructeurs qui lancent de manière ennuyeuse des exceptions vérifiées, comme ci-dessus, ou bien une logique d'initialisation plus complexe qui pourrait être sujette aux exceptions.

5voto

Jesper Points 65733

Parfois, vous voulez faire plus que simplement attribuer des valeurs à des variables statiques. Comme vous ne pouvez pas mettre d'instructions arbitraires dans le corps de la classe, vous pouvez utiliser un bloc d'initialisation statique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X