2014-11-05 36 views
0

以下兩個java類都初始化一些最終字段,第一個不會編譯(變量未初始化錯誤),第二個編譯正常。爲什麼?初始化java中的最後一個字段

public class Craps { 
    public static enum Outcome {ONGOING, WIN_FIRST, WIN_POINT, LOSE_FIRST, LOSE_POINT}; 
    private int currentNumber; 
    private final int point; 
    private Outcome gameResult = Outcome.ONGOING; 
    private static SecureRandom randomNumbers = new SecureRandom(); 

    public static int rollDice() { 
     return 2 + randomNumbers.nextInt(6) + randomNumbers.nextInt(6); 
    } 

    public Craps() { 
     currentNumber = rollDice(); 
     switch (currentNumber) { 
      case 7:case 11: 
       gameResult = Outcome.WIN_FIRST; 
       break; 
      case 2:case 3:case 12: 
       gameResult = Outcome.LOSE_FIRST; 
       break; 
      default: 
       point = currentNumber; 
     } 
    } 

    public void moreRolls() { 
     currentNumber = rollDice(); 
     if(currentNumber == point) { 
      gameResult = Outcome.WIN_POINT; 
     } else if(currentNumber == 7) { 
      gameResult = Outcome.LOSE_POINT; 
     } 
    } 


    public Outcome getGameResult() { 
     return gameResult; 
    } 

    public int getPoint() { 
     return point; 
    } 

    public int getCurrentNumber() { 
     return currentNumber; 
    } 
} 

public enum Book { 
    AHTP("book1", "1998"), 
    BHTP("book1", "1998"), 
    CHTP("book1", "1998"), 
    DHTP("book1", "1998"), 
    EHTP("book1", "1998"), 
    FHTP("book1", "1998"); 

    private final String title; 
    private final String copyrightYear; 

    Book(String bookTitle, String year) { 
     title = bookTitle; 
     copyrightYear = year; 
    } 

    public String getCopyrightYear() { 
     return copyrightYear; 
    } 

    public String getTitle() { 
     return title; 
    } 
} 

回答

3

一個final變量你曾經使用前必須初始化。在這種情況下

public Craps() { 
    currentNumber = rollDice(); 
    switch (currentNumber) { 
     case 7:case 11: 
      gameResult = Outcome.WIN_FIRST; 
      break; 
     case 2:case 3:case 12: 
      gameResult = Outcome.LOSE_FIRST; 
      break; 
     default: 
      point = currentNumber; 
    } 
} 

point,這是一個可變final,不必初始化。它僅在currentNumber不等於7,11,2,3或12時才被初始化。編譯器不會允許這樣做。

1

point並非總是設置(對於7,11,2,3,12),您還需要在這些情況下設置點。

1

由於點是最終的,所以即使對於情況7,11,2,3,12,也需要對其進行初始化。中斷正在阻止初始化。