316 votes

L’initialisation statique blocs

Pour autant que j’ai compris le « bloc de l’initialisation statique » est utilisé pour définir les valeurs de champ statique si elle ne peut se faire en une seule ligne.

Mais je ne comprends pas pourquoi nous avons besoin un bloc spécial pour cela. Par exemple, nous déclarons un champ static (sans une assignation de valeur). Et puis écrire plusieurs lignes de code qui génèrent et assigner une valeur au champ statique déclaré ci-dessus.

Pourquoi avons-nous besoin de ces lignes dans un bloc spécial comme : `` ?

515voto

Frederik Wordenskjold Points 3448

Vous pouvez également construire un bloc similaire :

C’est ce qu’on appelle chaque fois que la classe est construite. Le bloc statique seulement est appelé une fois, quel que soit le nombre d’objets de ce type que vous créez.

Exemple :

Ceci affiche :

145voto

Jon Skeet Points 692016

S'ils n'étaient pas dans un bloc d'initialisation statique, où seraient-ils? Comment feriez-vous pour déclarer une variable qui a pour seul but d'être local pour l'application de l'initialisation, et de le distinguer d'un champ? Par exemple, comment vous voulez écrire:

public class Foo
{
    private static final int widgets;

    static
    {
        int first = Widgets.getFirstCount();
        int second = Widgets.getSecondCount();
        // Imagine more complex logic here which really used first/second
        widgets = first + second;
    }
}

Si first et second n'étaient pas dans un bloc, ils ressemblent à des champs. S'ils étaient dans un bloc sans static , en face de lui, qui seraient considérés comme un exemple d'initialisation du bloc au lieu d'un bloc d'initialisation statique, de sorte qu'il serait exécuté une fois par construit exemple, plutôt que d'une fois dans le total.

109voto

Pointy Points 172438

Voici un exemple:

  private static final HashMap<String, String> MAP = new HashMap<String, String>();
  static {
    MAP.put("banana", "honey");
    MAP.put("peanut butter", "jelly");
    MAP.put("rice", "beans");
  }

Le code dans la partie "statique" de la section(s) seront exécutés à la classe de charge à temps, avant que toutes les instances de la classe sont construites (et avant tout les méthodes statiques sont appelés d'ailleurs). De cette façon vous pouvez vous assurer que les ressources de classe sont toutes prêtes à l'emploi.

Il est également possible d'avoir non statique initialiseur de blocs. Ceux qui agissent comme des extensions de l'ensemble de constructeur méthodes définies pour la classe. Elles ressemblent initialiseur statique blocs, sauf le mot-clé "static" est laissé de côté.

51voto

BalusC Points 498232

Il est également utile lorsque vous ne souhaitez pas attribuer de la valeur à quelque chose, telles que le chargement de quelque classe qu'une seule fois au cours de l'exécution.

E. g.

static {
    try {
        Class.forName("com.example.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        throw new ExceptionInInitializerError("Cannot load JDBC driver.", e);
    }
}

Hey, il y a un autre avantage, vous pouvez l'utiliser pour gérer les exceptions. Imaginez qu' getStuff() ici déclenche une Exception qui vraiment fait dans un bloc catch:

private static Object stuff = getStuff(); // Won't compile: unhandled exception.

puis un static initialiseur est utile ici. Vous pouvez gérer l'exception.

Un autre exemple est de faire des trucs par la suite ce qui ne peut pas être fait lors de l'attribution:

private static Properties config = new Properties();

static {
    try { 
        config.load(Thread.currentThread().getClassLoader().getResourceAsStream("config.properties");
    } catch (IOException e) {
        throw new ExceptionInInitializerError("Cannot load properties file.", e);
    }
}

Pour revenir sur le pilote JDBC exemple, que tout bon pilote JDBC permet également l'utilisation de l' static initialiseur inscrire lui-même dans l' DriverManager. Voir aussi cette et de cette réponse.

12voto

D.Shawley Points 30324

Il y a un peu de véritables raisons qu'il est nécessaire à l'existence:

  1. l'initialisation de static final membres dont l'initialisation peut lever une exception
  2. l'initialisation de static final membres avec des valeurs calculées

Les gens ont tendance à utiliser static {} blocs comme un moyen pratique pour initialiser les choses que la classe dépend dans l'exécution - comme s'assurer que classe particulière est chargé (par exemple, les pilotes JDBC). Qui peut être fait dans d'autres; cependant, les deux choses que je mentionne ci-dessus ne peut être fait avec une construction comme l' static {} bloc.

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