2011年4月27日水曜日

Enum(Java) はかなり強力

Enum 型。Java ではいまいち使いどころがわかっていなかったので調べてみました。

Java で通常どおり定義すると, Cと数字として扱っていますが
Java では, クラス?, インターフェイスのごとく扱えます。
また, 工夫すれば数字としても扱えます。

数字として扱いたいのは, JavaScript や, データベースで拾った値から
Enum 型変数を作りたいということです。

また, Java のEnum は関数の引数として, さらに switch の中身としても利用できます。
ふつうに数字として扱うよりも, interface のような役割をすることで, プログラムの
見通しがよくなることと思います。

サンプル1  Enum型定義
------------------------------------------------------------------------------------

package com.atmarkplant.tools.test;

public enum WAROTA
{
MAYUYU(0), LOVETAN(1), HARUGON(2), NACCHAN(3), AYARIN(4);

private int type;

private WAROTA ( int type )
{
this.type = type;
}

public int toValue ( )
{
return type;
}

public static WAROTA fromValue ( int type )
{
// Initialize.
WAROTA ret_val = MAYUYU;

for ( WAROTA warota : values() )
{
if ( warota.toValue() == type )
{
ret_val = warota;
}
}

return ret_val;
}
}
----------------------------------------------------------------------------------------------
まるで, ふつうのクラスみたいですね。
数字から, Enumへの変換, Enum変数から数字への変換を作っています。

values() という関数は, Enumに暗黙定義されている関数です。

サンプル2  実際に利用してみる
----------------------------------------------------------------------------------------------

package com.atmarkplant.tools.test;

/**
 * Enum test.
 * @author atmarkplant
 *
 */
public class EnumTest
{

/**
* @param args
*/
public static void main(String[] args)
{
WAROTA warota = WAROTA.valueOf( "MAYUYU" );

System.out.println(warota.toValue());   // 0

WAROTA warota2 = WAROTA.LOVETAN;
System.out.println(warota2.toValue()); // 1

switch ( warota )
{
case MAYUYU:
System.out.println("まゆゆです");
break;
case LOVETAN:
System.out.println("らぶたんです");
break;
case HARUGON:
System.out.println("はるごんです");
break;
case NACCHAN:
System.out.println("なっちゃんです");
break;
case AYARIN:
System.out.println("あやりんです");
break;
}

// Create from number.
WAROTA warota3 = WAROTA.fromValue( 2 );
System.out.println(warota3.toValue()); // 2

WAROTA warota4 = WAROTA.fromValue( 3 );
disp(warota4);
}

/**
* Dipaly original number.
* @param warota Warota
*/
public static void disp ( WAROTA warota )
{
System.out.println ( warota.ordinal());
}

}

実行結果は以下です


0
1
まゆゆです
2
3

やはり関数の引数として利用できることと, switch が利用できるのはいいですね。
はじめに書きました通り, サーバーサイドコードにおけるAjax から送信されたデータのハンドル
や, データベースの格納, 取り出しなどでは, 大いに活用できるかと思います。

0 件のコメント:

コメントを投稿