ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【java】列挙子 Enum

列挙型 Enum

参考:http://www.sejuku.net/blog/14779
enumを使う
{}の中に列挙型が持つ定数(列挙子)を記述する

最もシンプルな列挙型

enum Result { 
	SUCCESS,//定数なので大文字
	ERROER,//書き足す時便利なので末尾に「,」をつけている
}

列挙型の宣言

public static void main (String[] args){
    	
    Result res;
    res = Result.ERROR;
    	
    //例のごとくこう記述してもいい
    Result res2 = Result.SUCCESS;
    	
    switch(res){
    
        case ERROR://上の行でresの値とわかってるのでres.とはかかない
        System.out.println("誤りです");
        break;
        case SUCCESS://上の行でresの値とわかっいるのでres.とはかかない
        System.out.println("成功です");
        break;
    	
    }
    	
}

列挙型には0から始まる連番がセットされる。
ordinal()でアクセスできる。(ordinal = 序数)

enum Result { 
	SUCCESS,//0
	ERROER,//1
}
//ordinalメソッドで割り当てられた序数にアクセス
switch(res.ordinal()){
    case 0://上の行でresの値とわかっているのでres.とはかかない
    System.out.println("誤りです。");
    break;
    case 1://上の行でresの値とわかっているのでres.とはかかない
	System.out.println("成功です。");
	break;
}

ふと予約語以外の宣言した時の流れが気になったのですが、
この場合、Resultと変数を宣言するとプログラムがenum Resultを参照してenum Result分のメモリが確保され定数が格納される、という流れでしょうか。

後日メモリに格納される際の挙動などについて調べておこうと思います。

列挙子に値を持たせる、Enumにコンストラクタを持たせる

定数に値を持たせることもできる。
この場合コンストラクタを記述しないとエラーになる。

(参考サイトやeclipseのデフォルト?がpubricで宣言していたのでgetterで値を取得するようにしました。)

enum Result { 
	SUCCESS("成功です。"),
	ERROR("失敗です。");
	
    //持たせた値を格納する変数の宣言
	private final String msg;
	
    //コンストラクタ(必須)
    //定数の持つ値を引数msg(プライベート変数)で取得して、
    //その値をメンバ変数に格納
	Result(String msg){
		this.msg = msg;
	}

    //getterにメンバ変数の値を格納
	public String getMsg(){
		return this.msg;
	}
}
public class practice{

    public static void main (String[] args){
    	
    	Result = Result.SUCCESS;
    	
        //列挙型のgetterにアクセスして値を書き出す
    	System.out.println(res.getMsg());//成功です。
    	
    }
    
}

コンストラクタにはメソッドの実装もできる。

valueOfメソッド

参考:http://www.sejuku.net/blog/14628#valueOf

列挙子名を参照できる。

enum Result { 
	SUCCESS,
	ERROR;	
}

public class practice{

    public static void main (String[] args){
    	
    	Result res = Result.SUCCESS;
    	
        //resの値がSUCCESSだったらtrueが表示
    	System.out.println(res == res.valueOf("SUCCESS"));
    	
    }
    
}

存在しない列挙子名を指定するとIllegalArgumentExceptionというエラーが発生する。

文字列との比較

==ではエラー。
equals()で文字列SUCCESSとそのまま比較しても型が違うのでfalse

    Result res = Result.SUCCESS;
    String a = "SUCCESS";
    //定数と文字列の比較になるため結果はfalse
    System.out.println(res.equals(a));

ちなみに==は参照情報の比較を行いequals()は文字列の比較を行う。
==は参照型の比較なので文字列がおなじでも参照するメモリが違えば?trueにはならない
http://variable-fixed.hatenablog.com/entry/2017/01/21/153547

列挙子を文字列にすれば比較可能

frt.toString() == "Orange"

valueメソッド

参考:http://www.sejuku.net/blog/14769

定義した列挙子をまとめて返す

//values()はstaticメソッドなのでEnumクラス名から参照する
for(Result res : Result.values()){
	System.out.println(res.toString());
}