ホームページ  >  記事  >  Java  >  Java 列挙_Power ノードの概要

Java 列挙_Power ノードの概要

Y2J
Y2Jオリジナル
2017-05-02 14:52:551804ブラウズ

enum の正式名は enumeration で、JDK 5 で導入された新機能であり、java.lang パッケージに格納されています。この記事では、Java の列挙に関する知識を紹介します。必要な方は参照してください。enum の正式名は enumeration で、JDK 5 で導入された新機能であり、java.lang パッケージに格納されています。

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

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 クラス (java .lang. Enum は抽象クラスです)。列挙型は、一般的なパターン Class Enum271447d3c75ca4f8ce424bd25b75b2af> に準拠しており、E は列挙型の名前を表します。列挙型の各値は、保護された Enum(String name, int ordinal) コンストラクターにマップされます。ここで、各値の名前は文字列に変換され、序数設定は、この設定が作成された順序を表します。

package com.bjpowernode.test;
/**
 * 枚举测试类
 */
public enum EnumTest {
  MON, TUE, WED, THU, FRI, SAT, SUN;
}

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

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
  ... ...

トラバーサルやスイッチなどの一般的な操作

enum のトラバースとスイッチのサンプル コード:

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





SUN

---------------私は仕切りです------------ ------

今日は火曜日です

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

int compareTo(E o)
この列挙と指定されたオブジェクトの順序を比較します。

Class<E> getDeclaringClass()
回 この永続的な金額の列挙型に対応する CLASS オブジェクトを返します。

String name()

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

列挙された金額の順序番号を返します (これは列挙ステートメント内にあり、最初の定数順序は 0 です)。

String toString()

は、宣言に含まれる列挙型定数の名前を返すことができます。

static7f8fdcecef67626c97700d7b0c20c234>

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 After MON

getDeclaringClass(): com.hmw.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1

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

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

package com.bjpowernode.test;
 /**
 * 枚举测试类
 * 
 */
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 的应用
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.Enum1a4db2c2c2313771e5742b6debf617a1 を継承したクラスが実際に生成されていることがわかります。 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 を継承しているため、extends キーワードを使用して他のクラスを継承できないことです。 (Java は単一継承です)。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。