1。背景
Java言語が導入される前に、列挙タイプを示すための一般的なパターンは、int定数のセットを宣言することです。パブリックファイナルスタティックメソッドを使用する前に定義するために使用したコードは次のとおりです。1を使用して春を表し、2は夏を表す2、秋を表す3、冬を表す4を表します。
パブリッククラスシーズン{public static final int spring = 1; public static final int Summer = 2; public static final int autumn = 3; public static final int winter = 4;}この方法は、int列挙パターンと呼ばれます。しかし、このモデルの何が問題になっていますか?私たちはそれを長い間使用してきたので、問題はないはずです。通常、私たちが書いているコードでは、セキュリティ、使いやすさ、読みやすさを考慮します。まず、そのタイプの安全性を考えてみましょう。もちろん、このパターンはタイプセーフではありません。たとえば、春、夏、秋、冬に特定の値を必要とする関数を設計します。ただし、INTタイプでは、渡された値が合法であることを保証することはできません。コードは次のようになります:
Private String getChineseSeason(int Season){stringbuffer result = new StringBuffer(); switch(season){case seash.spring:result.append( "spring");壊す;ケースシーズン:summer:result.append( "Summer");壊す;ケースシーズン:result.append( "autumn");壊す;ケースシーズン。壊す;デフォルト:result.append( "season none on Earth");壊す; } return result.toString(); } public void dosomething(){system.out.println(this.getChineseSeason(season.spring)); //これは通常のシナリオSystem.out.println(this.getChineseseSoason(5));プログラムGetChinesEseason(Season.Spring)は、使用する方法です。しかし、GetChineseSeason(5)は明らかに事実ではなく、コンピレーションは非常に受動的です。実行時に何が起こるかわかりません。これは明らかに、Javaプログラムのタイプの安全性に準拠していません。
次に、このパターンの読みやすさを考えてみましょう。ほとんどの場合、列挙を使用する場合は、列挙タイプの文字列式を取得するために便利である必要があります。 Int列挙定数を印刷すると、表示されるのは数字のセットですが、これはあまり役に立ちません。 INT定数の代わりに文字列定数を使用することを考える場合があります。これらの定数に印刷可能な文字列を提供しますが、文字列比較操作に依存しているため、パフォーマンスの問題を引き起こします。そのため、このパターンも予想していません。タイプの安全性とプログラムの読みやすさの両方を考慮すると、INTと文字列の列挙パターンの欠点が明らかになります。幸いなことに、Java 1.5リリース以来、INTおよび文字列列挙パターンの欠点を回避し、多くの追加の利点を提供する別の代替ソリューションが提案されています。それが列挙タイプです。次の章では、列挙タイプの定義、機能、アプリケーションのシナリオ、利点と短所を紹介します。
2。定義<br /> enumタイプは、定数の固定セットで構成される法的タイプを指します。 Javaでは、キーワード列挙が使用され、列挙型を定義します。以下は、Java Enumタイプの定義です。
パブリックエインムシーズン{春、夏、秋、ワイナー;} 3。機能
列挙タイプを定義するJavaの声明は非常に簡単です。次の特性があります。
1)キーワード列挙の使用
このような基本的な要件に加えて、ユーザーは他のオプションをいくつか持っています
5)列挙は1つ以上のインターフェイス(インターフェイス)を実装できます(インターフェイス)6)新しい変数を定義できます7)新しい方法を定義できます8)特定の列挙値によって異なるクラスを定義できます
4。アプリケーションシナリオ
バックグラウンドで言及されているタイプの安全性を例として、そのコードを列挙タイプで書き直します。コードは次のとおりです。
パブリックエインムシーズン{春(1)、夏(2)、秋(3)、冬(4);プライベートINTコード;プライベートシーズン(intコード){this.code = code; } public int getCode(){return Code; }} public class easeason { / ** *英語シーズンを中国のシーズンに変換 * @paramシーズン * @return * / public string getChineseseason(シーズンシーズン){stringbuffer result = new StringBuffer(); switch(season){case spring:result.append( "[中国語:spring、列挙定数:" + season.name() + "、data:" + season.getcode() + "]");壊す;ケース秋:result.append( "[中国語:秋、列挙定数:" + season.name() + "、data:" + season.getCode() + "]");壊す;ケースサマー:result.append( "[中国語:夏、列挙定数:" + season.name() + "、data:" + season.getCode() + "]");壊す;ケースウィンター:result.append( "[中国:冬、列挙定数:" + season.name() + "、data:" + season.getCode() + "]");壊す;デフォルト:result.append( "season withoute arears" + season.name());壊す; } return result.toString(); } public void dosomething(){for(season s:season.values()){system.out.println(getChinesEseSoason(s)); //これは通常のシナリオです} //system.out.print.print.print.print(5)); //コンパイラはすでにここで失敗しています。これにより、タイプの安全性が保証されます} public static void main(string [] arg){ueseseason ueseason = new uesesoan(); outeason.dosomething(); }}[中国:春、列挙定数:春、データ:1] [中国:夏、列挙定数:夏、データ:2] [中国:秋、列挙定数:秋、データ:3] [中国語、列挙定数:冬、データ:4]
質問は次のとおりです。なぜenumタイプにドメインを追加したいのですか?目的は、データを定数に関連付けることです。たとえば、1は春を表し、2は夏を表します。
5。概要
では、いつ酵素を使用する必要がありますか?一週間の日、今年の季節など、コンパイル前に含まれるすべての値のコレクションなど、定数の固定セットが必要なときはいつでも。 Java 1.5の列挙は、ほとんどのプログラマーの要件を満たすことができ、その簡潔で使いやすい特性は非常に顕著です。
6。使用法
使用法1:定数
public Enum Color {赤、緑、空白、黄色}使用法2:切り替え
enum Signal {緑、黄、赤}パブリッククラストラフィックライト{信号色= signal.red; public void change(){switch(color){case red:color = signal.green;壊す;ケースイエロー:color = signal.red;壊す;ケースグリーン:color = signal.yellow;壊す; }}}使用法3:列挙に新しいメソッドを追加します
public Enum Color {Red( "Red"、1)、Green( "Green"、2)、Blank( "White"、3)、Yello( "Yellow"、4); //メンバー変数プライベート文字列名。プライベートインデックス; //構成メソッドプライベートカラー(文字列名、int index){this.name = name; this.index = index; } //通常の方法public static string getName(int index){for(color c:color.values()){if(c.getIndex()== index){return c.name; }} nullを返します。 } // get setメソッドpublic string getname(){return name; } public void setName(string name){this.name = name; } public int getIndex(){return index; } public void setIndex(int index){this.index = index; }}使用法4:列挙を上書きする方法
public Enum Color {Red( "Red"、1)、Green( "Green"、2)、Blank( "White"、3)、Yello( "Yellow"、4); //メンバー変数プライベート文字列名。プライベートインデックス; //構成メソッドプライベートカラー(文字列名、int index){this.name = name; this.index = index; } //メソッド@Override public String toString(){return this.index+"_"+this.name; }}使用法5:インターフェイスを実装します
パブリックインターフェイスの動作{void print();文字列getInfo(); } public Enum Color Implesign Behavior {Red( "Red"、1)、Green( "Green"、2)、Blank( "White"、3)、Yello( "Yellow"、4); //メンバー変数プライベート文字列名。プライベートインデックス; //構成メソッドプライベートカラー(文字列名、int index){this.name = name; this.index = index; } // interface method @override public string getInfo(){return this.name; } // interface method @override public void print(){system.out.println(this.index+":"+this.name); }}使用法6:インターフェイスを使用して列挙を整理します
パブリックインターフェイスフード{enumコーヒーを実装する{black_coffee、decaf_coffee、latte、cappuccino}デザートを実装する{フルーツ、ケーキ、ジェラート}}}上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。