問題代碼
public class EnumTest {
public static void main(String[] args) {
// ... 輸入處理 ...
Size size = Enum.valueOf(Size.class, input);
System.out.println("abbreviation=" + size.getAbbreviation()); // 報錯
}
public static String abbreviation; // 錯誤:靜態字段被所有實例共享
enum Size {
SMALL, MEDIUM, EXTRA_LARGE, EXTRA_EXTRA_LARGE
}
private void Size(String abbreviation) { // 錯誤:枚舉構造器必須私有且在枚舉內部
this.abbreviation = abbreviation;
}
public String getAbbreviation() { // 錯誤:方法應在枚舉內部
return abbreviation;
}
}
錯誤分析
- 構造器位置錯誤:枚舉構造器必須定義在
enum 內部,且默認 private。
- 字段作用域錯誤:
abbreviation 應為枚舉實例字段,而非外部類靜態字段。
- 方法歸屬錯誤:
getAbbreviation() 應屬於枚舉類型 Size。
- 枚舉常量缺少參數:定義常量時需傳入構造器參數,如
SMALL("S")。
修正代碼
public class EnumTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("請輸入服裝型號:(SMALL,MEDIUM,LARGE,EXTRA_LARGE,EXTRA_EXTRA_LARGE)");
String input = in.next().toUpperCase();
Size size = Enum.valueOf(Size.class, input);
System.out.println("Size=" + size);
System.out.println("abbreviation=" + size.getAbbreviation()); // 正確調用
if (size == Size.EXTRA_LARGE || size == Size.EXTRA_EXTRA_LARGE) // 原 ^ 應為 ||
System.out.println("很好,你注意到了下劃線");
}
}
enum Size {
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL"), EXTRA_EXTRA_LARGE("XXL");
private final String abbreviation; // 實例字段
Size(String abbreviation) { // 私有構造器
this.abbreviation = abbreviation;
}
public String getAbbreviation() { // 實例方法
return abbreviation;
}
}
關鍵點
- 枚舉常量後跟參數列表調用構造器。
- 字段用
private final 修飾保證不可變性。
- 邏輯判斷中
^ 是位異或,應用 || 邏輯或。