enumを使用していくつかの定数を作成します。
enum ids {OPEN, CLOSE};
OPEN値はゼロですが、100にしたいのですが可能ですか。
enum ids {OPEN = 100, CLOSE};
?
enumを使用していくつかの定数を作成します。
enum ids {OPEN, CLOSE};
OPEN値はゼロですが、100にしたいのですが可能ですか。
enum ids {OPEN = 100, CLOSE};
?
回答:
Java列挙型は、CまたはC ++列挙型とは異なります。これは、実際には整数の単なるラベルです。
Java列挙型は、クラスのように実装されています。複数の属性を持つこともできます。
public enum Ids {
OPEN(100), CLOSE(200);
private final int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
}
大きな違いは、タイプセーフであることです。つまり、SIZE変数にCOLOR列挙型を割り当てることについて心配する必要はありません。
詳細については、http://docs.oracle.com/javase/tutorial/java/javaOO/enum.htmlを参照してください。
enum class
ます。
はい。次のように、数値を列挙型のコンストラクターに渡すことができます。
enum Ids {
OPEN(100),
CLOSE(200);
private int value;
private Ids(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
詳細については、Sun Java言語ガイドを参照してください。
value
(たとえば)0に初期化する引数のない2番目のプライベートコンストラクターを追加するだけです。次に、(たとえば)DANCE
値のリストに含めます。
この方法の使い方について:
public enum HL_COLORS{
YELLOW,
ORANGE;
public int getColorValue() {
switch (this) {
case YELLOW:
return 0xffffff00;
case ORANGE:
return 0xffffa500;
default://YELLOW
return 0xffffff00;
}
}
}
方法は1つしかありません。
静的メソッドを使用して、次のようにEnumをパラメータとして渡すことができます。
public enum HL_COLORS{
YELLOW,
ORANGE;
public static int getColorValue(HL_COLORS hl) {
switch (hl) {
case YELLOW:
return 0xffffff00;
case ORANGE:
return 0xffffa500;
default://YELLOW
return 0xffffff00;
}
}
これらの2つの方法は、より少ないメモリとより多くのプロセスユニットを使用することに注意してください..これは最良の方法とは言えませんが、それは単なる別のアプローチです。
getColorValue()
2番目の例で同期されるのはなぜですか?
HL_COLORS.getColorValue(HL_COLORS.YELLOW);
列挙型を初期化せずにしたい場合があります。
非常に大きな列挙型を使用する場合は、以下が役立ちます。
public enum deneme {
UPDATE, UPDATE_FAILED;
private static Map<Integer, deneme> ss = new TreeMap<Integer,deneme>();
private static final int START_VALUE = 100;
private int value;
static {
for(int i=0;i<values().length;i++)
{
values()[i].value = START_VALUE + i;
ss.put(values()[i].value, values()[i]);
}
}
public static deneme fromInt(int i) {
return ss.get(i);
}
public int value() {
return value;
}
}
C / C ++の列挙型(base numおよびnexts incrementals)をエミュレートする場合:
enum ids {
OPEN, CLOSE;
//
private static final int BASE_ORDINAL = 100;
public int getCode() {
return ordinal() + BASE_ORDINAL;
}
};
public class TestEnum {
public static void main (String... args){
for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) {
System.out.println(i.toString() + " " +
i.ordinal() + " " +
i.getCode());
}
}
}
OPEN 0 100 CLOSE 1 101
ordinal()関数は、列挙内の識別子の相対位置を返します。これを使用して、Cスタイルの列挙型と同様に、オフセット付きの自動インデックスを取得できます。
例:
public class TestEnum {
enum ids {
OPEN,
CLOSE,
OTHER;
public final int value = 100 + ordinal();
};
public static void main(String arg[]) {
System.out.println("OPEN: " + ids.OPEN.value);
System.out.println("CLOSE: " + ids.CLOSE.value);
System.out.println("OTHER: " + ids.OTHER.value);
}
};
出力を提供します:
OPEN: 100
CLOSE: 101
OTHER: 102
編集:これはグランデスの答えに非常に似ていることに気づきましたが、非常にクリーンで、Cスタイルの列挙型に近づくことができるため、ここではそのままにします。
@scottf
列挙型はシングルトンのようなものです。JVMがインスタンスを作成します。
クラスで自分で作成する場合は、次のようになります。
public static class MyEnum {
final public static MyEnum ONE;
final public static MyEnum TWO;
static {
ONE = new MyEnum("1");
TWO = new MyEnum("2");
}
final String enumValue;
private MyEnum(String value){
enumValue = value;
}
@Override
public String toString(){
return enumValue;
}
}
そして、そのように使用できます:
public class HelloWorld{
public static class MyEnum {
final public static MyEnum ONE;
final public static MyEnum TWO;
static {
ONE = new MyEnum("1");
TWO = new MyEnum("2");
}
final String enumValue;
private MyEnum(String value){
enumValue = value;
}
@Override
public String toString(){
return enumValue;
}
}
public static void main(String []args){
System.out.println(MyEnum.ONE);
System.out.println(MyEnum.TWO);
System.out.println(MyEnum.ONE == MyEnum.ONE);
System.out.println("Hello World");
}
}
public class MyClass {
public static void main(String args[]) {
Ids id1 = Ids.OPEN;
System.out.println(id1.getValue());
}
}
enum Ids {
OPEN(100), CLOSE(200);
private final int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
}
@ scottf、ENUMで定義されたコンストラクタのために、おそらく混乱しました。
それについて説明させてください。
ときclass loader
の負荷のenum
クラスは、その後、enum
コンストラクタとも呼ばれます。何の上に!!はい、それはと呼ばれOPEN
ていclose
ます。何の値を持つ100
ためOPEN
と200
のためにclose
別の値を設定できますか?
はい、
public class MyClass {
public static void main(String args[]) {
Ids id1 = Ids.OPEN;
id1.setValue(2);
System.out.println(id1.getValue());
}
}
enum Ids {
OPEN(100), CLOSE(200);
private int id;
Ids(int id) { this.id = id; }
public int getValue() { return id; }
public void setValue(int value) { id = value; }
}
しかし、それは悪い習慣です。enum
表すために使用されるconstants
ようにdays of week
、colors in rainbow
事前に定義された定数、すなわち、このような小さなグループ。
C ++列挙子を見て混乱していると思います。Java列挙子は異なります。
これは、C / C ++列挙型に慣れている場合のコードです。
public class TestEnum {
enum ids {
OPEN,
CLOSE,
OTHER;
public final int value = 100 + ordinal();
};
public static void main(String arg[]) {
System.out.println("OPEN: " + ids.OPEN.value);
System.out.println("CLOSE: " + ids.CLOSE.value);
System.out.println("OTHER: " + ids.OTHER.value);
}
};