列挙機能
1. enum を使用して列挙クラスを定義すると、デフォルトでは、Object クラスを継承するのではなく、java.lang.Enum クラスが継承されます。このうち、java.lang.Enum クラスは、java.lang.Serializable と java.lang.Comparable
2 という 2 つのインターフェイスを実装しています。そのコンストラクターのアクセス制御が必要な場合、列挙型クラスのコンストラクターはプライベート アクセス修飾子のみを使用できます。記号が省略されている場合は、プライベート変更がデフォルトで使用されます。
3. 列挙クラスのすべてのインスタンスは列挙クラスに明示的にリストされている必要があります。そうしないと、この列挙クラスはインスタンスを生成できなくなります。これらのインスタンスがリストされると、プログラマが明示的に追加する必要がなく、システムはパブリックな静的な最終変更を自動的に追加します。
public enum Week { MON{ public String toLocaleString(){ return "星期一"; } },TUES{ public String toLocaleString(){ return "星期二"; } },WEB{ public String toLocaleString(){ return "星期三"; } },THUR{ public String toLocaleString(){ return "星期四"; } },FRI{ public String toLocaleString(){ return "星期五"; } },SAT{ public String toLocaleString(){ return "星期六"; } },SUN{ public String toLocaleString(){ return "星期日"; } }; public abstract String toLocaleString(); }
列挙型の走査
public class EnumTest { public static void main(String[] args){ for(Week w:Week.values()){ System.out.println(w); } } }
列挙型の一般的なメソッド
int CompareToメソッド
String name()は列挙型インスタンスの名前を返します
int ordinal()は列挙型Indexの列挙値を返します
String toString() は、名前よりも一般的に使用される列挙型のインスタンス名を返します
public static valueOf()
public class EnumTest { public static void main(String[] args){ Week day =Week.FRI; System.out.println(day);//FRI System.out.println(day.name());//FRI System.out.println(day.ordinal());//4 System.out.println(Week.valueOf("SUN").toLocaleString());//星期日 System.out.println(Week.values().length);//7 获取枚举长度 } }
列挙型のコンストラクター
public enum Gender { MALE("男"),FEMALE("女"); private String name; private Gender(String name){ this.name =name; } public String getName(){ return this.name; } public String toString(){ String name = null; switch(this){ case MALE: name="男"; break; case FEMALE: name="女"; break; } return name; } }
列挙型の包括的なアプリケーション例: 信号機
public enum Lamp { /*每个枚举元素各表示一个方向的控制灯*/ S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false), /*下面元素表示与上面的元素的相反方向的灯,它们的“相反方向灯”和“下一个灯”应忽略不计!*/ N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false), /*由南向东和由西向北等右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯*/ S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true); private Lamp(String opposite,String next,boolean lighted){ this.opposite = opposite; this.next = next; this.lighted = lighted; } /*当前灯是否为绿*/ private boolean lighted; /*与当前灯同时为绿的对应方向*/ private String opposite; /*当前灯变红时下一个变绿的灯*/ private String next; public boolean isLighted(){ return lighted; } /** * 某个灯变绿时,它对应方向的灯也要变绿 */ public void light(){ this.lighted = true; if(opposite != null){ Lamp.valueOf(opposite).light(); } System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!"); } /** * 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿 * @return 下一个要变绿的灯 */ public Lamp blackOut(){ this.lighted = false; if(opposite != null){ Lamp.valueOf(opposite).blackOut(); } Lamp nextLamp= null; if(next != null){ nextLamp = Lamp.valueOf(next); System.out.println("绿灯从" + name() + "-------->切换为" + next); nextLamp.light(); } return nextLamp; } }
上記は Java での列挙型の使用方法の詳細な紹介です。さらに関連する内容については、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。