Java での enum の使用の概要

黄舟
リリース: 2017-09-20 10:15:35
オリジナル
1790 人が閲覧しました

この記事は、Java での enum の詳細な使用法に関する関連情報を主に紹介します。この記事が、Java での enum の使用方法を理解して習得するのに役立つことを願っています。

enum は列挙の略で、JDK 1.5 で導入された新機能であり、java.lang パッケージに格納されています。

以下は、enum の使用に関する私の経験と概要の一部です。

オリジナルのインターフェース定義定数

public interface IConstants {
  String MON = "Mon";
  String TUE = "Tue";
  String WED = "Wed";
  String THU = "Thu";
  String FRI = "Fri";
  String SAT = "Sat";
  String SUN = "Sun";
}
ログイン後にコピー


構文(定義)

列挙型を作成するには、 enum キーワードを使用する必要があります。これは、作成された型がすべて java.lang の子であることを意味します。 .Enum class クラス (java.lang.Enum は抽象クラスです)。列挙型は一般的なパターン Class Enum

package com.hmw.test;
/**
 * 枚举测试类
 * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a>
 */
public enum EnumTest {
  MON, TUE, WED, THU, FRI, SAT, SUN;
}
ログイン後にコピー

に準拠します。このコードは実際に Enum (String name, int ordinal) を 7 回呼び出します: enum に対する

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
  ... ...
ログイン後にコピー


トラバーサル、スイッチ、その他の一般的な操作

トラバーサルおよびスイッチ操作のサンプル コード:

public class Test {
  public static void main(String[] args) {
    for (EnumTest e : EnumTest.values()) {
      System.out.println(e.toString());
    }

    System.out.println("----------------我是分隔线------------------");

    EnumTest test = EnumTest.TUE;
    switch (test) {
    case MON:
      System.out.println("今天是星期一");
      break;
    case TUE:
      System.out.println("今天是星期二");
      break;
    // ... ...
    default:
      System.out.println(test);
      break;
    }
  }
}
ログイン後にコピー

出力結果:

MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔线------------------
今天是星期二
ログイン後にコピー


enum オブジェクトの一般的なメソッドの紹介

int CompareTo(E o)

この列挙と指定されたオブジェクトを比較します注文。

Class getDeclaringClass()

この列挙定数の列挙型に対応する Class オブジェクトを返します。

String name()

列挙宣言で宣言されているように、この列挙定数の名前を返します。

int ordinal()

列挙定数の序数 (初期定数の序数が 0 である列挙宣言内の位置) を返します。

String toString()

宣言に含まれる列挙定数の名前を返します。

static

/**
 * Java学习交流QQ群:589809992 我们一起学Java!
 */
public class Test {
  public static void main(String[] args) {
    EnumTest test = EnumTest.TUE;

    //compareTo(E o)
    switch (test.compareTo(EnumTest.MON)) {
    case -1:
      System.out.println("TUE 在 MON 之前");
      break;
    case 1:
      System.out.println("TUE 在 MON 之后");
      break;
    default:
      System.out.println("TUE 与 MON 在同一位置");
      break;
    }

    //getDeclaringClass()
    System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());

    //name() 和 toString()
    System.out.println("name(): " + test.name());
    System.out.println("toString(): " + test.toString());

    //ordinal(), 返回值是从 0 开始
    System.out.println("ordinal(): " + test.ordinal());
  }
}
ログイン後にコピー

出力結果:

TUE 在 MON 之后
getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1
ログイン後にコピー


enumのプロパティとメソッドをカスタマイズする

value属性とgetValue()メソッドをenumオブジェクトに追加します:

package com.hmw.test;

/**
 * 枚举测试类
 * 
 * @author <a href="mailto:hemingwang0902@126.com" rel="external nofollow" rel="external nofollow" >何明旺</a>
 */
public enum EnumTest {
  MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {
    @Override
    public boolean isRest() {
      return true;
    }
  },
  SUN(0) {
    @Override
    public boolean isRest() {
      return true;
    }
  };

  private int value;

  private EnumTest(int value) {
    this.value = value;
  }

  public int getValue() {
    return value;
  }

  public boolean isRest() {
    return false;
  }
}
public class Test {
  public static void main(String[] args) {
    System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());
  }
}
ログイン後にコピー

出力結果:

EnumTest.FRI 的 value = 5
ログイン後にコピー


EnumSet、EnumMapアプリケーション

/**
 * Java学习交流QQ群:589809992 我们一起学Java!
 */
public class Test {
  public static void main(String[] args) {
    // EnumSet的使用
    EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
    for (EnumTest day : weekSet) {
      System.out.println(day);
    }

    // EnumMap的使用
    EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
    weekMap.put(EnumTest.MON, "星期一");
    weekMap.put(EnumTest.TUE, "星期二");
    // ... ...
    for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
      Entry<EnumTest, String> entry = iter.next();
      System.out.println(entry.getKey().name() + ":" + entry.getValue());
    }
  }
}
ログイン後にコピー


原理分析

enumの構文構造はclassの構文とは異なりますが、コンパイラによるコンパイル後に生成されるものがクラスファイルです。クラスファイルを逆コンパイルすると、実際に java.lang.Enum を継承したクラスが生成されていることがわかります。 EnumTest を逆コンパイルした後に取得される内容 (javap com.hmw.test.EnumTest コマンド) は次のとおりです:

public class com.hmw.test.EnumTest extends java.lang.Enum{
  public static final com.hmw.test.EnumTest MON;
  public static final com.hmw.test.EnumTest TUE;
  public static final com.hmw.test.EnumTest WED;
  public static final com.hmw.test.EnumTest THU;
  public static final com.hmw.test.EnumTest FRI;
  public static final com.hmw.test.EnumTest SAT;
  public static final com.hmw.test.EnumTest SUN;
  static {};
  public int getValue();
  public boolean isRest();
  public static com.hmw.test.EnumTest[] values();
  public static com.hmw.test.EnumTest valueOf(java.lang.String);
  com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
}
ログイン後にコピー

つまり、実際には enum はクラスですが、Java コンパイラーは構文の解析とコンパイルを支援します。それだけです。

概要

enum は通常のクラスとして考えることができ、それらはすべていくつかのプロパティとメソッドを定義できます。違いは、enum は java.lang .Enum を継承しているため、enum は extends キーワードを使用して他のクラスを継承できないことです。 (Java は単一継承です)。

以上がJava での enum の使用の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート