Javaの列挙enumについてお話しします
28273 ワード
一.列挙とは
列挙は1種のデータ型で、集合のいくつかの特徴を持って、複数の要素を格納することができて、しかし格納オブジェクトは有限で固定して、列挙も比較的によくある使用シーンがあって、性別(男、女)、色(赤、黄、青)、月(月、火...日)、四季(春、夏、秋、冬)、地理的位置(東、西、南、北)、方向(前、後、左、右)などを表現する必要がある場合は、列挙に適しています.
二.列挙の定義
JAvaではenumを使用して列挙を定義します.class、interfaceと同じレベルです(Enumではなくenumであることに注意してください).定義列挙には2つのケースがあります.
1つ目:デフォルトコンストラクタ(空のコンストラクタ)
メンバー変数とメンバーメソッドは定義されておらず、private Quarter(){}は省略されています.
簡単に説明します:enumを列挙するコンストラクタはprivateのみです
2つ目:メンバー変数、パラメトリックコンストラクタの定義
列挙は、メンバー属性、メソッド、抽象メソッド、静的メソッドなどを含むメンバー変数を定義できます.
注意:列挙はクラスと同様に、複数のコンストラクタ、すなわち1つのパラメトリック付きコンストラクタ、またはパラメトリックなしコンストラクタがあり、コンパイルは通過できます.
その他:列挙enumはjavaをデフォルトで継承する.lang.Enumクラス、javaを実現しました.lang.Seriablizableとjava.lang.Comparableの2つのインタフェースは、シーケンス化および比較可能である. のすべての列挙値は定数であり、デフォルトではpublic static finalを用いて修飾されているが、enumはクラスではなく、自然に継承されたり実現されたりすることはできない. 列挙値は最初の行にある必要があります.そうしないと、コンパイルエラーが発生します.
三.列挙の一般的な使い方
1.列挙要素およびメンバー変数の取得
出力結果:
2.列挙遍歴
クエリ条件として列挙要素を取り出す必要がある場合があります.この場合、
3.switch条件判断
列挙された要素は限られており固定されており,switchによる条件判断は適切である.
実行後の結果:
簡単に説明すると、ここではdefaultの内容は必要ありません.あるいはWINTERをdefaultとすればいいです.天然にタイプ制限があるため、既存の要素とnullしか伝えられませんが、通常は伝達パラメータがnullかどうかを事前に判断し、switchがnullを受信するとjavaに報告します.lang.NullPointerException.
4.列挙比較
4.1. 等しいかどうかを判断する
2つの要素が等しいかどうかを列挙して直接=を用いて判断すればよい.クラスではなくインスタンス化もできないため、格納位置はオブジェクトによって異なることはない.
実行結果:
equals()法で比較することもできますが、その下層も==で実現されるため、必要ありません.
4.2. ちくじひかく
compareToで列挙要素の比較を行います.ここでは列挙中の要素の前後順を比較し、位置序数の差を返します.
実行結果:
compareToの方法を見てみましょう
5.列挙もインタフェースを実現することができる
ただし、列挙は他のクラスを継承できません.
6.インタフェースを使用して列挙を整理する
列挙が多すぎて管理が難しく、筋道がはっきりしていない場合は、インタフェースを通じて複数の関連列挙を組織して管理することができます.
四.まとめ
本文は主に列挙enumの主な特徴を紹介して、定義して、参構器がなくて、参構器があって、列挙の常用方法の例と主な応用シーンがあって、もし間違いがあれば、批判して正して、共に進歩することを望んで、ありがとうございます!
列挙は1種のデータ型で、集合のいくつかの特徴を持って、複数の要素を格納することができて、しかし格納オブジェクトは有限で固定して、列挙も比較的によくある使用シーンがあって、性別(男、女)、色(赤、黄、青)、月(月、火...日)、四季(春、夏、秋、冬)、地理的位置(東、西、南、北)、方向(前、後、左、右)などを表現する必要がある場合は、列挙に適しています.
二.列挙の定義
JAvaではenumを使用して列挙を定義します.class、interfaceと同じレベルです(Enumではなくenumであることに注意してください).定義列挙には2つのケースがあります.
1つ目:デフォルトコンストラクタ(空のコンストラクタ)
public enum Quarter {
SPRING, SUMMER, AUTUMN, WINTER;
}
メンバー変数とメンバーメソッドは定義されておらず、private Quarter(){}は省略されています.
public enum Quarter {
SPRING, SUMMER, AUTUMN, WINTER;
private Quarter(){}
}
簡単に説明します:enumを列挙するコンストラクタはprivateのみです
2つ目:メンバー変数、パラメトリックコンストラクタの定義
列挙は、メンバー属性、メソッド、抽象メソッド、静的メソッドなどを含むメンバー変数を定義できます.
public enum Quarter {
SPRING(" "), SUMMER(" "), AUTUMN(" "), WINTER(" ");
private Quarter(String name){
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//
public static void printName(){
System.out.println(Quarter.SUMMER);
}
//
public abstract void printValue();
}
注意:列挙はクラスと同様に、複数のコンストラクタ、すなわち1つのパラメトリック付きコンストラクタ、またはパラメトリックなしコンストラクタがあり、コンパイルは通過できます.
その他:
三.列挙の一般的な使い方
1.列挙要素およびメンバー変数の取得
public static void main(String[] args) {
//
System.out.println(Quarter.SPRING);
// toString() String
System.out.println(Quarter.SPRING.name());
System.out.println(Quarter.SPRING.toString());
//
System.out.println(Quarter.SPRING.getName());
}
出力結果:
SPRING
SPRING
SPRING
2.列挙遍歴
クエリ条件として列挙要素を取り出す必要がある場合があります.この場合、
Quarter.values()
メソッドを呼び出すことによって遍歴する必要があります.public static void main(String[] args) {
// values() Quarter
Quarter[] quarters = Quarter.values();
List<String> quarterParam = new ArrayList<>(quarters.length);
// List quarterParam
for (Quarter quarter : quarters) {
quarterParam.add(quarter.toString());
}
}
3.switch条件判断
列挙された要素は限られており固定されており,switchによる条件判断は適切である.
public static void main(String[] args){
Quarter quarter = Quarter.AUTUMN;
switch (quarter) {
case SPRING:
System.out.println(" , :" + SPRING);
break;
case SUMMER:
System.out.println(" , :" + SUMMER);
break;
case AUTUMN:
System.out.println(" , :" + AUTUMN);
break;
case WINTER:
System.out.println(" , :" + WINTER);
break;
default:
System.out.println(" ");
break;
}
}
実行後の結果:
, :AUTUMN
簡単に説明すると、ここではdefaultの内容は必要ありません.あるいはWINTERをdefaultとすればいいです.天然にタイプ制限があるため、既存の要素とnullしか伝えられませんが、通常は伝達パラメータがnullかどうかを事前に判断し、switchがnullを受信するとjavaに報告します.lang.NullPointerException.
4.列挙比較
4.1. 等しいかどうかを判断する
2つの要素が等しいかどうかを列挙して直接=を用いて判断すればよい.クラスではなくインスタンス化もできないため、格納位置はオブジェクトによって異なることはない.
public static void main(String[] args){
System.out.println(Quarter.AUTUMN == Quarter.AUTUMN);
System.out.println(Quarter.AUTUMN == Quarter.WINTER);
}
実行結果:
true
false
equals()法で比較することもできますが、その下層も==で実現されるため、必要ありません.
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
//equals
public final boolean equals(Object other) {
return this==other;
}
}
4.2. ちくじひかく
compareToで列挙要素の比較を行います.ここでは列挙中の要素の前後順を比較し、位置序数の差を返します.
public static void main(String[] args){
System.out.println(Quarter.AUTUMN.compareTo(Quarter.SPRING));
System.out.println(Quarter.AUTUMN.compareTo(Quarter.WINTER));
}
実行結果:
2
-1
compareToの方法を見てみましょう
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
//
private final int ordinal;
// compareTo ordinal
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() &&
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
}
5.列挙もインタフェースを実現することができる
public interface WeatherInterface {
//
public String getTemperature(Quarter quarter);
}
public enum Quarter implements WeatherInterface{
SPRING(" "), SUMMER(" "), AUTUMN(" "), WINTER(" ");
private Quarter(String name){
this.name = name;
}
private String name;
public String getName() {
return name;
}
//
@Override
public String getTemperature(Quarter quarter) {
switch (quarter) {
case SPRING:
return " ";
case SUMMER:
return " ";
case AUTUMN:
return " ";
case WINTER:
return " ";
default:
return " ";
}
}
}
ただし、列挙は他のクラスを継承できません.
public class Pquarter {}
//
public enum Quarter extends Pquarter {}
6.インタフェースを使用して列挙を整理する
列挙が多すぎて管理が難しく、筋道がはっきりしていない場合は、インタフェースを通じて複数の関連列挙を組織して管理することができます.
public interface Weather {
enum Quarter implements Weather {
SPRING, SUMMER, AUTUMN, WINTER;
}
enum Temperature implements Weather {
MODERATE, HEAT, COOL, COLD
}
// Weather.Quarter.SPRING 。
}
四.まとめ
本文は主に列挙enumの主な特徴を紹介して、定義して、参構器がなくて、参構器があって、列挙の常用方法の例と主な応用シーンがあって、もし間違いがあれば、批判して正して、共に進歩することを望んで、ありがとうございます!