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 
    } 
} 

Ich habe eine kurze Frage. Der Code-Block, der direkt nach der statischen Schlüsselwortdeklaration beginnt, welcher Methodentyp ist das? Das habe ich noch nie zuvor gesehen. Wenn mich jemand aufklären könnte, wäre das sehr zu begrüßen. Vielen Dank.Ungewöhnliche "statische" Methode Erklärung

Antwort

16

Dies ist keine Methode, sondern ein statischer Initialisierungsblock einer Klasse. Sie können mehr darüber in der Java Language Specification lesen.

Der Code innerhalb wird nach dem Laden der Klasse einmal ausgeführt.

+1

+1: Prägnant, mit Bezug für weitere Lektüre und klare Erklärung. Darum geht es bei SO ... –

+0

Danke für die schnelle und perfekte Antwort! – Jack

3

Wie Grzegorz richtig hervorhebt, ist es ein static initializer block.

Here is another resource den Unterschied zwischen Klasseninitialisierung und Instanziierung, sowie die Reihenfolge, in der Klassenvariablen und statische Initialisierer Blöcke genannt werden erklärt.

Ein verwandtes Konzept ist, dass die Instanzeninitialisierung Blöcke, die zusammen mit anonymen Klassen für das Handy double-brace initialization Idiom verwendet werden können:

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

Es ist auch gut Initialisierungsreihenfolge zu wissen, wie ich erinnere mich zuerst in dieser Reihenfolge kommt statische Variablen, als statische Block. Wichtiger Punkt ist auch die Zeit, wann dieser statische Block ausgeführt wird - bei der ersten Erwähnung der entsprechenden Klasse, nicht bei der Klasseninstanzerstellung.