Javaã§ã¯è¤æ°ã®å®æ°ãã¾ã¨ãã¦æ±ãåã¨ãã¦enum(åæå)ãç¨æããã¦ãã¾ãã
ããã¯ããã§ä¾¿å©ãªã®ã§ããç©è¶³ããªãã¨ããããã£ã¦ããããSealedã¯ã©ã¹ãªã©ã使ããã¨ã§è§£æ±ºã§ããããã«ãªãã®ã§ã解説ãã¾ãã
enumå
enumã¯ç¶æ
ããã¼ã¿åºåã表ãã®ã«ãã使ããã¾ãã
æ§æã¯æ¬¡ã®ããã«ãªãã¾ãã
enum åå { åæ1, åæ2, ... }
ä¾ãã°æ¬¡ã®ãããªç¶æ
ã表ãã¨ãã¾ãã
ãã®ç¶æ ã表ãenumã¯æ¬¡ã®ããã«ãªãã¾ããããããã®å¤ã¯å¤§æåã§æ¸ãããã«ãã¾ãã
enum State {
READY, RUNNING, SUSPENDED, TERMINATED
}
enumã§ã¯ããããã®å¤ãã¨ã«å¦çãè¡ãã¨ãããã¨ãããããã¾ããããã§switchã¨ç¸æ§ãããã§ãã
State s = State.READY; switch (s) { case READY -> System.out.println("æºåå®äº"); case RUNNING -> System.out.println("å®è¡ä¸"); case SUSPENDED-> System.out.println("åæ¢ä¸"); case TERMINATED-> System.out.println("çµäº"); }
switchæã®å ´åã¯enumå¤ã足ããªãã¦ã大ä¸å¤«ã§ãããswitchå¼ã§ã¯å
¨ã¦ã®enumå¤ãå¦çããªãã¨ã¨ã©ã¼ã«ãªãã¾ãã
ãã®ãã¨ãèããã¨ãenumå¤ãã¹ã¦ã®å¦çãããswitchã¯å¼ã«ãã¦ãããã»ããããã§ããã(Java 14以é)
var message = switch (current) { case READY -> "æºåå®äº"; case RUNNING -> "å®è¡ä¸"; case SUSPENDED -> "åæ¢ä¸"; case TERMINATED -> "çµäº"; };
enumã«å¤ãæããã
enumå¤ããããã«æ°å¤ãªã©ãå²ãå½ã¦ããå ´åãããã¾ããããããå ´åã¯ãã£ã¼ã«ãã¨ãã¦å®ç¾©ãããã¨ãã§ãã¾ãã ã¡ã½ãããå®ç¾©ã§ããã®ã§getterãç¨æããããtoStringã¡ã½ããããªã¼ãã¼ã©ã¤ããããã¨ã«ãªãã¾ããã ãã£ã¼ã«ãã¯private finalã«ãã¦ããã¾ãããã
enum State { READY("æºåå®äº"), RUNNING("å®è¡ä¸"), SUSPENDED("åæ¢ä¸"), TERMINATED("çµäº"); private final String name; State(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return name; } }
ãã ã¾ãããã£ã¼ã«ãã¨ã³ã³ã¹ãã©ã¯ã¿ã¨getterãå®ç¾©ãã¦ããã®ããã©ãã®ã§ãLombokã使ããããªãã¾ãã
@Value enum State { READY(1, "æºåå®äº"), RUNNING(2, "å®è¡ä¸"), SUSPENDED(3, "åæ¢ä¸"), TERMINATED(4, "çµäº"); int code; String name; @Override public String toString() { return name; } }
Sealedã¯ã©ã¹ãæ¡å¼µenumã¨ãã¦ä½¿ã
Javaã®enumã¯Cã®enumããã¯ä¾¿å©ãªã®ã§ããããã©ã¡ã¼ã¿ã追å ãããã¨ãã使ãæ¹ãã§ãã¾ããã
ä¾ãã°MouseEventã¨ããenumããã£ã¦ãCLICKEDã¨MOVEDããããã ãã©åº§æ¨ãæãããããã¨ãããããªå ´åã§ãããã¨CLICKEDã«ã¯ã©ã®ãã¿ã³ããæããããã
ã¨ããå ´åã«Sealedã¯ã©ã¹ã使ãã¾ããå®éã«ä½¿ãã®ã¯interfaceã«ãªããã©ã
enum Button { LEFT, MIDDLE, RIGHT } sealed interface Event { record Clicked(Button button, int x, int y) implements Event {} record Moved(int x, int y) implements Event {} }
sealedãã¤ããã¯ã©ã¹ãã¤ã³ã¿ãã§ã¼ã¹ã§ã¯ããã®nestedã¯ã©ã¹ã ãã§ç¶æ¿ãè¡ããããã«ãªãã¾ããnestedã¯ã©ã¹ä»¥å¤ã§ç¶æ¿ãè¡ãå ´åã«ã¯permitsã§æå®ãã¾ãã
sealed interface Event permits Clicked, Moved {} record Clicked(Button button, int x, int y) implements Event {} record Moved(int x, int y) implements Event {}
ããã¦ãJava 19ã§ãã¬ãã¥ã¼ã¨ãã¦å°å ¥ãããpattern matching for switchã¨record patternãå©ç¨ããã°ãenumã®ããã«æ±ãã¾ãã
Event e = new Event.Clicked(Button.RIGHT, 7, 3); var message = switch (e) { case Event.Clicked(var b, int x, int y) -> "%sãã¿ã³ã%d,%dã§ã¯ãªãã¯ããã".formatted(b, x, y); case Event.Moved(int x, int y) -> "%d,%dã«åãã".formatted(x, y); };
ããã§Eventåã¯Sealedãªã®ã§ãç¶æ¿ããã¯ã©ã¹ã¯ClickedãMovedã«éããããããå¯è½ãªãã¹ã¦ã®åããã§ãã¯ãããã¨ã«ãªãã¾ãã
ã¨ãããã¨ã§ãrecordã¨sealedã¯ã©ã¹ã¨ãã¿ã¼ã³ãããã¨switchå¼ãçµã¿åãããã¨é«æ©è½enumã®ããã«ä½¿ããã¨ãã話ã§ããã