Javaの基本:オブジェクト指向---列挙

前シリーズでは、我々はJavaでの基本的なデータ型を導入することで、データ、クラスおよびインタフェースを表しおよび操作は、このセクションの探究は、Javaで型を列挙。

いわゆる列挙は四季年があることを、たとえば、列挙することができ、このクラスの使用はまた、データを扱うことができますが、7日の週は、存在し、その値が制限され、データの特別な種類ですが、列挙タイプは、より単純で、安全で便利です。

ここでは、また、導入、実装の原則を列挙を導入する必要があります。

基本
の基本的な使用方法の
基本的な列挙の定義および使用が比較的簡単で、私たちは例を見て、服のサイズは以下のように、我々は、大規模な3つのサイズ、小型/媒体を/備え、列挙サイズを定義します:
公共サイズ{列挙
SMALL、MEDIUM ,, LARGEを
}

列挙この列挙は、三つの値を含むキーワード、サイズを定義するために使用され、それぞれ、小、中、大、大文字は、複数の値がカンマで区切られた、一般値です。列挙型は、別のファイルとして定義することができ、それはまた、内部的に、他のクラスで定義することができます。

そのようなサイズとして使用することができる:
サイズサイズ= Size.MEDIUM
サイズサイズ宣言可変サイズは、タイプサイズ、サイズ=可変サイズに割り当てSize.MEDIUM意志媒体列挙値です。

その列挙リテラルにToStringメソッド戻り、すべての列挙型はまた、名前()メソッドは、例えば、など)(のtoStringの値を返した:
サイズサイズ= Size.SMALL;
のSystem.out.println(size.toStringを());
のSystem.out.println(size.name());
出力は小さいです。

列挙型変数は、使用とequalsすることができます結果を比較すると、例えば、同じである:
サイズサイズ= Size.SMALL;
のSystem.out.println(サイズ
Size.SMALL)
のSystem.out.println(size.equals(Size.SMALL));
のSystem.out.println(サイズ== Size.MEDIUM);
出力は、それぞれ三行、上記のコード、本当の、真、偽。

列挙値は、サイズを比較することができるためです。法)(列挙型int序を有し、例えば、次のコードが出力され、0から開始し、列挙値文の順序を示す:1。
サイズサイズ= Size.MEDIUM;
のSystem.out.println(size.ordinal ())。

さらに、列挙型は、Java API同等のインタフェースに実装され、例えば、のcompareTo列挙値は、実際には、比較の順序のサイズを比較する他の方法と比較することによって行うことができる、-1中小未満の次のコードを出力:
サイズ= Size.SMALLサイズ;
のSystem.out.println(size.compareTo(Size.MEDIUM))。

以下のように列挙型を使用し、他の変数同じ場所、メソッドパラメータ、クラス変数、インスタンス変数とswitch文を列挙するためにも使用することができる、など、コードされてもよい
静的ボイドonChosen(サイズサイズ){
スイッチ(サイズ){
ケースSMALL:
のSystem.out.println( "を選択小"); BREAK;
ケースMEDIUM ,:
のSystem.out.println( "を選択培地"); BREAK;
ケースLARGE:
のSystem.out.println( "を選択ラージ") ; BREAK;
}
}
switchステートメント内で、列挙型の接頭辞ではない列挙値、例えば、直接SMALL、Size.SMALLを使用することができません。

列挙型は、例えば、次のコードはtrueに出力され、静的のvalueOf(String)メソッドは、対応する文字列列挙値を返すことができています
するSystem.out.println(Size.SMALL == Size.valueOf(「SMALL」 ));

列挙型値は、静的メソッドを持って、例えば全ての列挙された値を含む均一なアレイ、および宣言順の順序を戻します
するための(サイズサイズ:Size.values()){
System.out.printlnは(サイズ);
}
三列、LARGEすなわちSMALL、MEDIUM、画面出力。

列挙利点
次のようにJavaサポートは、JDK 5列挙から開始される前に、成形は、一般的に同様の機能を達成するために、静的クラス変数の定義され、コードがある:
クラスサイズ{
最終SMALL = 0 INTパブリック静的。
最終的な静的INT = MEDIUM、公衆1;
2 = LARGE最終int型のpublic static;
}

利点の列挙は明白です:
列挙構文の定義は、より簡潔です。
列挙安全、型列挙の変数は、その値がnull、または列挙値のいずれかのいずれかであり、それは他の値のために不可能であるが、整数変数を使用して、その値を強制する方法ないであろう、値があるかもしれません効果がありません。
列挙型は、簡単に使用する、(などの値、のvalueOf、のtoString、など)の多くの便利なメソッドが付属しています。

原則の基本的な実現に
列挙型は、実際にはJava APIの継承java.lang.Enumクラスのその対応するクラスのためのJavaコンパイラを変換することができます。

列挙クラスは、二つのインスタンス変数と順序名は、コンストラクタで送信され、名前()のtoString()、序数()のcompareTo()、等号()メソッドは、列挙クラス名と順序変数に係る実施例であるました達成。

値および方法のvalueOfコンパイラが自動的に列挙型のそれぞれに添加し、列挙型上記サイズコード変換の一般的なカテゴリは、おそらくのように次の
パブリッククラスサイズのファイナルがenum {延び
パブリック静的新しい新しい最終サイズ=サイズSMALLを( "SMALL"、0);
公共の静的媒体、最終的なサイズ=新しい新しいサイズ( "MEDIUM" ,. 1);
パブリック静的新しい新しい最終サイズ=サイズLARGE( "LARGE"、2)。

private static Size[] VALUES = 
        new Size[]{SMALL,MEDIUM,LARGE};

private Size(String name, int ordinal){
    super(name, ordinal);
}

public static Size[] values(){
    Size[] values = new Size[VALUES.length];
    System.arraycopy(VALUES, 0, 
            values, 0, VALUES.length);
    return values;
}

public static Size valueOf(String name){
    return Enum.valueOf(Size.class, name);
}

}

いくつかの説明:
サイズは、列挙型は、私たちのフォローアップ記事は無視することができ、ここで説明し、親クラスは、一般的な文言で表し、最終的なものと継承することはできません。
サイズは、プライベートコンストラクタを持っている、とORDINAL名を受け入れ、親クラスに伝達され、外部の新しいインスタンスを作成していないプライベートを表します。
三つの列挙値は、それが最終的なもので、変更することはできません、実際には3つの静的変数です。
値は、コンパイラによって追加され、それはすべての列挙値を保持された値の内部配列を有しています。
valueOfメソッドが追加のパラメータSize.classを渡し、親クラスと呼ばれ、型情報がクラスを示し、フォローアップ記事では、私たちが、実際には、親クラスの値は名前に基づいて対応するメダルのコントラストを得るために呼び出すメソッドにバックアップされている情報の種類を記述します値について。

通常の列挙は、列挙値は、その対応する序数値に変換され、switch文では、対応するクラス変数に変換されます。

これは、列挙型クラスの性質にも見ることができますが、コンパイラが自動的にたくさんのことを行いますので、その使用はまた、より多くの、コンパクト、安全で便利です。

典型的なシナリオの
用途
、使用上に列挙したが、多くの場合、列挙が関連付けられている実際には最も簡単な、インスタンス変数やメソッドである、例えば、上記の例のサイズ、各列挙値が略語と中国の名前にリンクさせることができる、あなたが必要があるかもしれません静的メソッドは次のように変更サイズコードに対応する頭字列挙値を記載:
公共列挙{サイズ
の小さな(「S」、「S」)、
培地(「M」、「中」)、
LARGE( "L"、 "大")。

private String abbr;
private String title;

private Size(String abbr, String title){
    this.abbr = abbr;
    this.title = title;
}

public String getAbbr() {
    return abbr;
}

public String getTitle() {
    return title;
}

public static Size fromAbbr(String abbr){
    for(Size size : Size.values()){
        if(size.getAbbr().equals(abbr)){
            return size;
        }
    }
    return null;
}

}

コードは、2つの略称とタイトルインスタンス変数、および対応するgetメソッド、および中国の名前の省略形を定義する上で、それぞれ、プライベートコンストラクタを定義し、中国は略称を受け入れ、それぞれの列挙値の定義が渡された場合fromAbbrが静的メソッドを定義しながら、値を対応する列挙に略対応する値を返します。

列挙値がセミコロンに書き込まれた後、列挙値の定義は、頂部に配置する必要があることに注意すべきである(;)最後に追加のコードを書くことができます前に。

この列挙は、例えば、他のカテゴリと同様用いて定義:
;サイズS = Size.MEDIUM
のSystem.out.println(s.getAbbr())。

Size.fromAbbr = S( "L");
のSystem.out.println(s.getTitle());
上記のコード出力:M、L

原理
:コード以外のインスタンス変数とメソッドを加え、同様の変換後に上記に列挙型が、対応する変数とメソッドを追加し、修正さ工法は、おそらく以下である
パブリッククラスサイズのファイナルの列挙を拡張します{
公共静的小さな最終サイズ=
新しい新しいサイズ(「小」、0、「S」、「S」);
公共の静的媒体、最終的なサイズ=
新しい新しいサイズ(「媒体」,. 1、「M」、「中」) ;
パブリック静的大きい最終的なサイズ=
新しい新しいサイズ(「大」、2、「L」、「大」)。

プライベート文字列の略称。
プライベート文字列のタイトル。

プライベートサイズ(文字列名、int型の序数、
文字列の略称、文字列のタイトル){
スーパー(名前、序)。
this.abbr =略称。
this.title =タイトル;
}
// ...其他代码
}

説明
各列挙値は、多くの場合、関連するラベル(ID)を持つ、一般的に、整数int型に代表される、整数は、ストレージスペースを節約するネットワークトラフィックを削減することができます。アイデアは、自然の列挙を使用することです序数値が付属していますが、良い選択をしませ序します。

なぜ?序値が列挙値の定義における位置の変化に伴って変化するので、一般的には、我々は、idと値列挙値との関係は、内に保存されている、特に表現IDの列挙値を変わらないことを願っています多くのローカルタイム。

例えば、サイズは上記の例、Size.SMALLの順序は私たちが望む0,0の手段であるSize.SMALLですが、私たちは、超小型の値を追加した場合、次に言うXSMALL?
サイズ列挙{公共
XSMALL、SMALL、MEDIUM ,, LARGE
}
この場合、0手段XSMALLこと。

したがって、一般的には別の利点は、IDが定義できるインスタンス変数の使用で、インスタンス変数は、IDを表す追加することです。例えば、サイズの例は以下のように書くことができる:
公共列挙{サイズ
XSMALL(10)、SMALL(20)と、MEDIUM、(30)、LARGE(40)。

private int id;
private Size(int id){
    this.id = id;
}
public int getId() {
    return id;
}

}

高度な使用法は
、いくつかの高度な使用を列挙例えば、各列挙値関連付けられたクラス本体は、列挙型は、抽象メソッド、メソッド内の各列挙値を達成することができ、それは書き換えることができる部分を宣言することができ方法の他のタイプのために。

例えば、我々は、(このコードはメインディスプレイ構文、非常に有意義ではない)変更サイズコードを参照してください
パブリック列挙サイズ{
SMALL {
@Override
公共ボイドonChosen(){
System.out.printlnは(「選ば小」);
}
}、{MEDIUM、
@Override
公共ボイドonChosen(){
System.out.printlnは( "を選択培地");
}
}、{LARGE
@Override
公共ボイドonChosen(){
System.out.printlnは( "大きく選択");
}
}。

public abstract void onChosen();

}

サイズ列挙型が選択を示す、onChosen抽象メソッドを定義し、コードサイズの後に実行され、それぞれの列挙値の背面は、クラス定義{01}を有する、onChosen方法を書き換えられます。

何が良いの文言は、それを何ですか?各部分または列挙値は、いくつかの特定の挙動を有する場合、そのようなアプローチの使用が比較的簡単です。この例では、switch文のサイズの値に応じて異なるコードを実行するために、その対応するswitch文の上に導入しました。

スイッチの欠点は、コードと一緒ではないかもしれないswich列挙型コード定義の定義は、新しい列挙値ならば、同じことがコードのスイッチを変更するために必要とされなければならないが、忘れることですが、抽象メソッドを使用している場合、忘れることは不可能です同時に列挙値の定義では、コンパイラは、両方の関連する行動コードを定義するために強制されます。ビヘイビアコードと列挙値は密接に関連しているのであれば、上記の表記法を使用して、安全で維持しやすい、より簡潔であることができます。

インテリアの文言は、それを達成する方法ですか?各列挙値が列挙の種類に対応するクラスを継承するクラスを生成し、次いで、コードの特定のクラス定義本体の値を追加する、列挙値は、サブクラスオブジェクトになり、我々は、特定のコードではないだろう繰り返します。

他の列挙高度な使用法は、例えば、インターフェイスを実装することができ列挙は、列挙が、これは導入されない、比較的小さなを使用して、インターフェイスで定義することができ、そこです。

概要
このセクションでは、列挙型を記述する基本的な使い方、一般的な、高度な利用シナリオを紹介し、プロセスはクラスとしても使用することができますが、使用方法を説明しますが、また、実装の原則を説明し、データの列挙型のためだけでなく、列挙タイプは、より単純で、安全で便利です。

公開された81元の記事 ウォン称賛37 ビュー50000 +

おすすめ

転載: blog.csdn.net/gaolh89/article/details/98788352