6 votes

Java : qu'est-ce que static{} ?

Quelqu'un peut-il m'expliquer ce qui suit ?

public class Stuff
{
    static
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch ( ClassNotFoundException exception )
        {
            log.error( "ClassNotFoundException " + exception.getMessage( ) );
        }
...
}

Que fait ce fichier statique { ...} ?

Je connais les variables statiques en C++, mais s'agit-il d'un bloc statique ou autre chose ?

Quand ces mesures seront-elles exécutées ?

14voto

Chii Points 7798

Le bloc statique est appelé classe initialisateur statique - il est exécuté la première fois que la classe est chargée (et c'est la seule fois qu'il est exécuté [note de bas de page]).

L'objectif de ce bloc particulier est de vérifier si le MySQL est sur le classpath (et lance une erreur/log si ce n'est pas le cas).


[Le bloc statique est exécuté une fois par classloader qui charge la classe (donc si vous avez plusieurs classloaders qui sont distincts les uns des autres (par exemple, qui ne délèguent pas), il sera exécuté une fois pour chacun d'entre eux.

8voto

dimos Points 84

L'utilisation principale des blocs d'initialisation statiques consiste à effectuer diverses opérations d'initialisation qui ne seraient pas appropriées dans le cadre d'un constructeur, de sorte que le constructeur et les initialisateurs placent l'objet nouvellement créé dans un état totalement cohérent pour son utilisation.

Contrairement aux constructeurs, par exemple, les initialisateurs statiques ne sont pas hérités et ne sont exécutés qu'une seule fois lorsque la classe est chargée et initialisée par le JRE. Dans l'exemple ci-dessus, la variable de classe foo aura la valeur 998877 une fois l'initialisation terminée.

Notez également que les initialisateurs statiques sont exécutés dans l'ordre dans lequel ils apparaissent textuellement dans le fichier source. Il existe également un certain nombre de restrictions sur ce que vous ne pouvez pas faire à l'intérieur d'un de ces blocs, comme l'interdiction d'utiliser des exceptions vérifiées, l'interdiction d'utiliser l'instruction de retour ou les mots-clés this et super.

1voto

Alexander Pogrebnyak Points 24964

Je tiens à ajouter que les variables statiques et les initialisateurs statiques sont exécutés dans l'ordre d'apparition au moment du chargement de la classe. Ainsi, si votre initialisateur statique s'appuie sur une variable statique, celle-ci doit être initialisée avant le bloc statique en question, par ex.

final static String JDBC_DRIVER = getJdbcDriver( );

static
{
  try
  {
    Class.forName(JDBC_DRIVER);
  }
  catch ( ClassNotFoundException exception )
  {
    log.error( "ClassNotFoundException " + exception.getMessage( ) );
  }
}

Dans cet exemple getJdbcDriver sera exécuté avant l'initialisateur statique. De plus, il peut y avoir plus d'un initialisateur statique dans la classe. Une fois de plus, ils sont exécutés dans l'ordre d'apparition.

Je tiens également à mentionner l'existence d'initialisateurs d'instance, qui surprennent lorsqu'on les voit pour la première fois. Ils ressemblent à un bloc de code à l'intérieur du corps de la classe, comme ceci.

class MyClass
{
  final int intVar;

  {
    intVar = 1;
  }
}

Dans le cas général, leur utilisation est quelque peu inutile, en raison du constructeur, mais ils sont utiles pour mettre en œuvre la version Java des fermetures.

1voto

BalusC Points 498232

Le bloc d'initialisation statique est exécuté chaque fois que la classe est chargée pour la première fois. Cela peut se produire si quelque chose à un niveau plus élevé fait un Class#forName("yourpackage.YourClass") ou un new YourClass() sur la classe en question pour la première fois.

Par coïncidence, les pilotes JDBC décents ont également quelque chose de similaire à l'intérieur. Ils s'enregistrent notamment dans le fichier DriverManager à l'aide d'un bloc d'initialisation statique :

static {
    DriverManager.registerDriver(new ThisDriver());
}

de sorte qu'à chaque fois que vous effectuez une Class.forName("somepackage.ThisDriver") vous enregistrerez effectivement le pilote dans la base de données DriverManager afin que vous puissiez obtenir une connexion par la suite.

1voto

SBTec Points 179

En plus de tout ce qui précède, il existe une différence minime dans l'utilisation du constructeur de classe et de l'initialisateur de classe. Le constructeur, comme nous le savons, est généralement utilisé pour initialiser les objets et si nous avons des variables statiques, le bloc statique est généralement utilisé pour les initialiser lorsque la classe est chargée.

Lorsque nous avons des variables statiques et un bloc statique, les variables statiques sont initialisées en premier, puis le bloc.

Lorsque la classe est chargée pour la première fois, le bloc statique s'initialise avant le constructeur de la classe.

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