2010-05-25 15 views
6
public class Card { 

    public enum Rank { DEUCE, THREE, FOUR, FIVE, SIX, 
     SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE } 

    public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES } 

    private final Rank rank; 
    private final Suit suit; 
    private Card(Rank rank, Suit suit) { 
     this.rank = rank; 
     this.suit = suit; 
    } 

    public Rank rank() { return rank; } 
    public Suit suit() { return suit; } 
    public String toString() { return rank + " of " + suit; } 

    private static final List<Card> protoDeck = new ArrayList<Card>(); 

    // Initialize prototype deck 
    **static** { 
     for (Suit suit : Suit.values()) 
      for (Rank rank : Rank.values()) 
       protoDeck.add(new Card(rank, suit)); 
    } 

    public static ArrayList<Card> newDeck() { 
     return new ArrayList<Card>(protoDeck); // Return copy of prototype deck 
    } 
} 

Tengo una pregunta rápida. El bloque de código que comienza justo después de la declaración de palabra clave estática, ¿qué tipo de método es ese? Nunca había visto eso antes. Si alguien pudiera iluminarme, eso sería muy apreciado. Gracias.Declaración de método "estático" inusual

Respuesta

16

Este no es un método, sino un bloque Inicializador estático de una clase. Puede leer más sobre esto en el Java Language Specification.

El código dentro se ejecuta una vez después de cargar la clase.

+1

+1: conciso, con referencia para lecturas adicionales, y una explicación clara. Esto es de lo que se trata SO ... –

+0

¡Gracias por la respuesta rápida y perfecta! – Jack

3

Como Grzegorz señala correctamente, es un static initializer block.

Here is another resource explicar la diferencia entre inicialización de clase y instanciación, así como el orden en que se llaman variables de clase y bloques inicializador estático.

Un concepto relacionado es el de bloques inicializador de instancia, que pueden utilizarse junto con las clases anónimas para la práctica double-brace initialization idioma:

private static final Set<String> VALID_CODES = new HashSet<String>() {{ 
    add("XZ13s"); 
    add("AB21/X"); 
    add("YYLEX"); 
    add("AR2D"); 
}}; 
0

También es bueno saber orden de inicialización, como yo recuerde primero en este orden vienen las variables estáticas, que el bloque estático. También es importante el momento en que se ejecuta este bloque estático: en la primera mención de la clase correspondiente, no en la creación de la instancia de clase.

Cuestiones relacionadas