Java enum

Posted by Adam on August 24, 2022
```java import lombok.Getter; import lombok.AllArgsConstructor; @Getter @AllArgsConstructor public enum DayOfWeek { MONDAY("Monday", 1), TUESDAY("Tuesday", 2), WEDNESDAY("Wednesday", 3), THURSDAY("Thursday", 4), FRIDAY("Friday", 5), SATURDAY("Saturday", 6), SUNDAY("Sunday", 7); private String displayName; private int numericValue; } ``` ```java DayOfWeek day = DayOfWeek.MONDAY; System.out.println("Today is " + day.getDisplayName()); // 輸出:Today is Monday System.out.println("Numeric value of " + day.getDisplayName() + " is " + day.getNumericValue()); // 輸出:Numeric value of Monday is 1 ``` # enum json 在 Java 裡,enum.values() 回傳的是該 enum 型別的「陣列物件」(T[],T 為你的 enum),而不是字串陣列。但如果你把它丟到一個常見的 REST 回應(例如 Spring Boot 的 ResponseEntity 或 @RestController)裡,預設的 JSON 序列化(Jackson)又會把 enum 轉成它們的 name()(也就是字串),於是最終送到前端的 JSON 會長這樣: 範例程式 ```java // 定義一個 enum public enum Color { RED, GREEN, BLUE; } // Controller @RestController public class MyController { @GetMapping("/colors") public ResponseEntity<Color[]> getColors() { // 下面這行回傳的型別是 Color[](物件陣列) Color[] all = Color.values(); return ResponseEntity.ok(all); } } ``` 在預設狀況下,Spring 會用 Jackson 把 `Color[]` 序列化成 ```json ["RED","GREEN","BLUE"] ``` 這裡的 JSON 元素是字串,因為 Jackson 預設把 enum 序列化成它的 name()。 要點整理 1. Java 層面:enum.values() → 回傳 T[](真正的 enum 物件陣列) 2. HTTP/JSON 層面:預設序列化成字串陣列(因為 enum 被序成 name()) 3. 如果你真的想把 enum 當作「物件」送(例如多一個 code、label 欄位),可以在 enum 上或屬性上加 Jackson 註解: ```java @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum Color { RED(1,"紅色"), GREEN(2,"綠色"), BLUE(3,"藍色"); public final int code; public final String label; Color(int code, String label){ this.code=code; this.label=label; } } ``` 如此序列化後就會是 ```json [ {"name":"RED","code":1,"label":"紅色"}, {"name":"GREEN","code":2,"label":"綠色"}, {"name":"BLUE","code":3,"label":"藍色"} ] ``` ── 總結: · Java 端收到/回傳的是 enum 物件陣列 (`Color[]`) · 預設 JSON 層面則是「字串陣列」 (enum.name()),若要 JSON 物件化需額外設定。