2010-05-25 10 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 
    } 
} 

빠른 질문이 있습니다. 정적 키워드 선언 바로 다음에 시작하는 코드 블록은 어떤 유형의 메서드입니까? 나는 전에 그것을 본 적이 없다. 누군가가 나를 계몽 할 수 있다면, 크게 감사하겠습니다. 감사.비정상적인 "정적"메소드 선언

답변

16

이것은 메소드는 아니지만 클래스의 정적 Initializer 블록입니다. Java Language Specification에서 자세한 내용을 볼 수 있습니다.

코드는 클래스를로드 한 후 한 번 실행됩니다.

+1

+1 : 간략하게, 더 읽을 거리와 명확한 설명을 위해 참고할 수 있습니다. 이것은 SO가 모든 것에 관한 것입니다 ... –

+0

신속하고 완벽한 응답을 주셔서 감사합니다! – Jack

3

Grzegorz가 정확하게 지적한대로 static initializer block입니다. 클래스 초기화인스턴스화의 차이뿐만 아니라, 클래스 변수와 static 초기화 블록이라고하는 순서를 설명

Here is another resource.

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

내가 같이 초기화 순서를 알고도 좋다 :

이와 관련된 개념은 편리한 double-brace initialization 관용구에 대한 익명 클래스와 함께 사용할 수 있습니다 인스턴스 초기화 블록,의 것입니다 정적 블록보다 정적 변수가 먼저 오는 순서로 기억하십시오. 또한 중요한 점은이 정적 블록이 실행될 때 - 클래스 인스턴스 생성이 아니라 해당 클래스를 처음 언급 할 때입니다.

관련 문제