コンセプト
enumのフルネームは列挙で、JDK 1.5で導入された新機能です。
Javaでは、 enumキーワードによって変更されたタイプはEnumタイプです。フォームは次のとおりです。
enum色{赤、緑、青}列挙にメソッドが追加されない場合、列挙値は0から始まる順序付き値にデフォルトです。カラー列挙タイプを例にとると、その列挙定数は赤:0、緑:1、青:
列挙の利点:定数は統合された方法で編成および管理できます。
列挙のための典型的なアプリケーションシナリオ:エラーコード、ステートマシンなど。
列挙タイプの性質
enum新しいデータ型のように見えますが、実際には、Enumは制限されたクラスであり、独自の方法があります。
列挙を作成すると、コンパイラはjava.lang.Enumから継承されている関連クラスを生成します。
java.lang.Enumクラス宣言
パブリックアブストラクトクラスenum <e ends enum <e >>等しい<e>、シリアル化可能{...}を実装する列挙方法
列挙では、いくつかの基本的な方法が提供されています。
values() :列挙インスタンスの配列を返し、この配列の要素は列挙されている順序で厳密に維持されます。
name() :インスタンス名を返します。
ordinal() :インスタンスが0から始まると宣言されたときに注文を返します。
getDeclaringClass() :インスタンスが属する列挙タイプを返します。
equals() :それが同じオブジェクトであるかどうかを決定します。
==を使用して、 enumインスタンスを比較できます。
さらに、 java.lang.Enum 、 ComparableでSerializableインターフェイスを実装するため、Compareto()メソッドも提供されます。
例:列挙を表示する基本的な方法
public class enummethoddemo {enum color {red、green、blue;} enum size {big、middle、small;} public static void main(string args []){system.out.println( "================すべての色を印刷するすべての色を印刷する============================================================================================ System.out.println( "=============すべてのサイズを印刷========================================= System.out.println( " + green.getdeclaringclass()); green.equals(color.green)); }}出力
==================================================================================================================================すべてのサイズ======================== getDeclaringClass():class org.zp.javase.enumeration.enumdemo $ colorgreen hashcode():460141958green compareto color.green:0green equals color.green:green equals size.middle:fals equal
列挙の特徴
列挙の特性は、1つの文で要約されています。
継承することができないことに加えて、 enum基本的に通常のクラスと見なすことができます。
しかし、この文は個別に理解する必要があります。詳細に説明しましょう。
列挙はメソッドを追加できます
概念の章では、列挙値は0から始まる順序付けされた値にデフォルトです。質問は、表示された列挙に値を割り当てる方法です。
Javaは= enum定数に値を割り当てることを許可していません
C/C ++にさらされている場合、割り当てシンボル=自然に間違いなく考えることができます。 c/c ++言語では、列挙は割り当てシンボル=表示された列挙定数に割り当てることができます。ただし、残念ながら、enum定数に割り当てられた割り当て記号= Java構文では許可されていません。
例:C/C ++言語の列挙宣言
typedef enum {one = 1、2、3 = 3、10 = 10} number;列挙は、通常の方法、静的方法、抽象的な方法、およびコンストラクターメソッドを追加できます。
Javaはインスタンスに値を直接割り当てることはできませんが、さらに優れたソリューションがあります。列挙にメソッドを追加して、ディスプレイ割り当てを間接的に実装します。
enumを作成するときは、複数のメソッドを追加し、コンストラクターを追加できます。
1つの詳細に注意してください。列挙のメソッドを定義する場合は、列挙の最後のインスタンスの最後にセミコロンを追加する必要があります。さらに、列挙では、最初にインスタンスを定義する必要があり、インスタンスの前にフィールドまたはメソッドを定義することはできません。それ以外の場合、コンパイラはエラーを報告します。
例:通常の方法、静的方法、抽象的な方法、および列挙のメソッドを構築する方法を完全に示します
public enum errorcode {ok(0){public string getDescription(){return "suctune"; }}、error_a(100){public string getDescription(){return "error a"; }}、error_b(200){public string getdescription(){return "error b"; }};プライベートINTコード; //コンストラクター:列挙のコンストラクターは、プライベート許可としてのみ宣言できます。または、許可を宣言しないプライベートエラーコード(int番号){// constrountor this.code = number; } public int getCode(){//通常のメソッド戻りコード; } //通常の方法public abstract string getDescription(); // abstract Method public static void main(string args []){// static method for(errorcode s:errorcode.values()){system.out.println( "code:" + s.getcode() + "、description:" + s.getdescription(); }}}注:上記の例は、列挙がさまざまな方法の定義をサポートすることを示すためだけにお勧めできません。ここに簡略化された例があります
例:エラーコード列挙タイプの定義
この例の実行結果と上記の例はまったく同じです。
public Enum errorcodeen {ok(0、 "success")、error_a(100、 "error a")、error_b(200、 "error b"); errorcodeen(int number、string description){this.code = number; this.description = description; } private int code;プライベート文字列の説明; public int getCode(){return Code; } public string getDescription(){return description; } public static void main(string args []){// static method for(errorcodeen s:errorcodeen.values()){system.out.println( "code:" + s.getcode() + "、description:" + s.getdescription(); }}}列挙はインターフェイスを実装できます
enum 、一般クラスのようなインターフェイスを実装できます。
また、前のセクションでエラーコード列挙クラスを実装します。インターフェイスを実装することにより、メソッドを制約できます。
public interface inummerenum {int getCode(); String getDescription();} public Enum errorcodeen2は、inumberenum {ok(0、 "success")、error_a(100、 "error a")、error_b(200、 "error b"); errorcodeen2(int number、string description){this.code = number; this.description = description; } private int code;プライベート文字列の説明; @Override public int getCode(){return Code; } @Override public string getDescription(){return description; }}列挙は継承できません
列挙は別のクラスを継承することはできません。もちろん、別の列挙を継承することはできません。
enumは実際にjava.lang.Enumクラスから継承されており、Javaは多発性継承をサポートしていないため、列挙は他のクラスを継承することはできず、もちろん別のenumを継承することはできません。
列挙されたアプリケーションシナリオ
定数を整理します
JDK1.5の前に、Javaの定数の定義はpublic static final TYPE aでした。この形で。列挙を使用すると、アソシエーションの定数を整理して、コードをより読みやすく安全にすることができ、列挙によって提供される方法も使用できます。
列挙宣言形式
注:列挙にメソッドが定義されていない場合は、コンマ、セミコロン、または最後のインスタンスの後に何も追加することもできます。
次の3つの宣言方法は同等です。
enum color {赤、緑、青} enum色{赤、緑、青、} enum color {赤、緑、青。 }状態マシンを切り替えます
スイッチステートメントを使用して、状態マシンを作成します。 JDK7の後、Switchはint、char、String、enumタイプのパラメーターをサポートしています。これらのタイプのパラメーターと比較して、列挙を使用したスイッチコードがより読みやすくなります。
enum信号{赤、黄、緑} public static string gettrafficinstruct(信号信号){string instruct = "信号ライト障害"; switch(signal){case red:instruct = "red light stop";壊す;ケースイエロー:指示= "黄色の光に注意してください";壊す;ケースグリーン:Instruct = "Green Light Line";壊す;デフォルト:break; } return instruct;}列挙を整理します
同様のタイプの列挙は、インターフェイスまたはクラスを通じて編成できます。
ただし、通常はインターフェイスによって編成されます。
その理由は、Javaインターフェイスがコンパイル時に列挙タイプにpublic static Modifierを自動的に追加することです。 Javaクラスは、コンパイル時にenumタイプにstatic修飾子を自動的に追加します。違いを見たことがありますか?そうです、つまり、クラスでenumを整理します。 publicに変更しない場合は、このパッケージでのみアクセスできます。
例:インターフェイスで酵素を整理します
パブリックインターフェイスプラント{enum野菜を実装します{ジャガイモ(0、 "ジャガイモ")、トマト(0、 "トマト");野菜(int番号、文字列の説明){this.code = number; this.description = description; } private int code;プライベート文字列の説明; @Override public int getCode(){return 0; } @Override public String getDescription(){return null; }} enumフルーツは、inumberenum {Apple(0、 "Apple")、Orange(0、 "Orange")、Banana(0、 "Banana"); Fruit(int number、string description){this.code = number; this.description = description; } private int code;プライベート文字列の説明; @Override public int getCode(){return 0; } @Override public String getDescription(){return null; }}}例:クラスで酵素を整理します
この例は、前の例と同じ効果があります。
Public Class Plant2 {Public Enum Vegetable Impleste Inumberenum {...} //コードを省略して、パブリックエインムフルーツを実装します{...} //コードを省略}戦略の列挙
戦略の列挙は、効果的なJavaに示されています。この列挙は、列挙されたネストされた列挙によって列挙定数を分類します。
このアプローチはスイッチステートメントほど簡潔ではありませんが、より安全で柔軟性があります。
例:EffectViejavaのポリシー列挙の例
Enum Payrollday {Monday(Paytype.weekday)、火曜日(Paytype.weekday)、水曜日(Paytype.weekday)、木曜日(Paytype.weekday)、金曜日(Paytype.weekday)、土曜日(Paytype.weekend)、日曜日(Paytype.weekend);プライベート最終PayType PayType; PayRollday(PayType PayType){this.PayType = PayType; } double pay(double haursworked、double payrate){paytype.pay(hoursworked、payrate); } //ポリシーenumプライベートエニューペイタイプ{feaceday {double overtimepay(double hours、double payrate){return hours <= hours_per_shift? 0 :( hours -hours_per_shift) * Payrate / 2; }}、週末{double overtimepay(double hours、double payrate){return hours * payrate / 2; }};プライベート静的最終int hours_per_shift = 8;抽象二重オーバータイミーペイ(二重hrs、二重給与);ダブルペイ(ダブルアワーウェーク、ダブルペイレート){double basepay = hoursworked *給与; return basepay + overtimepay(hoursworked、給与); }}}テスト
System.out.println( "金曜日に8時間の1時間ごとの賃金を稼ぐ人の収益:" + payrollday.friday.pay(8.0、100)); System.out.println( "土曜日に8時間1時間賃金を稼ぐ人の収益:" + payrollday.saturday.pay(8.0、100));
enumsetとenummap
Javaは、酵素の操作に便利な2つのツールクラスを提供します - enumsetとEnummap。
EnumSet 、列挙タイプの高性能Set実装です。その中に配置された列挙定数は、同じ列挙型に属する必要があります。
EnumMap 、列挙型に合わせて調整されたマップ実装です。他のMap実装を使用する(HashMapなど)を使用すると、マッピングを評価するために列挙タイプインスタンスを完了することもできますが、列挙の使用はより効率的です。キー値と同じ列挙タイプのインスタンスのみを受信することができます。Enumタイプインスタンスの数は比較的固定されており、Enumapはエインムタイプに対応する値を保存するために配列を使用します。これにより、Enumpは非常に効率的になります。
// enumset system.out.println( "enumset display"); enumset <errorcodeen> errset = enumset.allof(errorcodeen.class); for(errorcodeen e:errset){system.out.println(e.name() + ":" + e.ordinal());} // enummap system.out.println( "enummap display"); enummap <statemachine.signal、string> errmap = new enummap(statemachine.signal.class); errmap.put(statemachine.signal.red、 "red light"); errmap.put(statemachine.signal.yellow、 "yellow"); errmap.put(statemachine.signal.green、 "green light"); errmap.entryset()。iterator(); System.out.println(entry.getKey()。name() + ":" + entry.getValue());}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。