switch文と列挙型とString型

2018年4月4日構文

スポンサーリンク

こんにちは。「Javaを復習する初心者」です。switch文で扱えるプリミティブ型とラッパークラスについて前回書きました。swichi文で扱えるものは残りは列挙型とString型です。今回はこの2つの型を使ってみました。

スポンサーリンク

プログラム

以下にフローを書きます。合格、不合格を列挙型で定義して、判定処理するフローです。

フィールド

修飾子 変数の型 変数名 内容
private 列挙型 Judge PASSED, FAILED

フロー

  1. 列挙型Judgeの定数の配列judgesを定義し、以下の値で初期化する。
    要素番号
    0 Judge.PASSED
    1 Judge.FAILED
  2. String型変数resultを定義し、nullで初期化する。
  3. 配列judgesのそれぞれ順番に以下の処理をする。各要素をjudgeとする。
    1. judgeで以下の分岐処理をする。
      1. judgeがPASSEDの場合、resultに”合格”を格納する。
      2. judgeがFAILEDの場合、resultに不合格を格納する。
    2. “result: ” + resultをprintlnで出力する。
    3. String型変数msgを宣言し、nullで初期化する。
    4. resultで以下の分岐処理をする。
      1. resultが”合格”の場合、msgに”おめでとうございます。” + result + “です。”を格納する。
      2. resultが”不合格”の場合、msgに”残念ながら” + result + “です。”を格納する。

以下はソースと実行結果です。

package test;

public class HelloSwitchEnumString {

    private static enum Judge {
        PASSED, FAILED
    }

    public static void main(String[] args) {
        Judge[] judges = { Judge.PASSED, Judge.FAILED };
        String result = null;

        for (Judge judge : judges) {
            switch (judge) {
            case PASSED:
                result = "合格";
                break;
            case FAILED:
                result = "不合格";
                break;
            }

            System.out.println("result: " + result);

            String msg = null;
            switch (result) {
            case "合格":
                msg = "おめでとうございます。" + result + "です。";
                break;
            case "不合格":
                msg = "残念ながら" + result + "です。";
                break;
            }

            System.out.println(msg);
        }
    }
}
result: 合格
おめでとうございます。合格です。
result: 不合格
残念ながら不合格です。

解説

列挙型では定数をグループ化することができます。一番簡単な方法は定数名のみを列挙する方法です。「private static」の部分については考え方がいろいろあると思いますが、このクラス内のみで使うためこのように記述しました。定数クラスを作ってそこに定義するなら「public static」だと思います。列挙型で定義する定数は大文字のみで書くのが一般的のようです。

上記サンプルでは列挙型定数の配列を定義し、拡張for文で各要素で分岐処理をしています。前半のswitch文ではキーを列挙型の定数にしています。後半のswitch文ではキーをString型にしています。ただし、昔のバージョンのJavaではswitch文にこのような型をキーにすることができなかったようです。

列挙型定数

このサンプルでは列挙型の定数で出力するための分岐処理をしてresultという変数に文字列を格納していますが、以下のように列挙型定数と値を対応させることもできます。

package test;

public class HelloSwitchEnumLabel {

    private static enum Judge {
        PASSED("合格"), FAILED("不合格");

        private String label;

        private Judge(String label) {
            this.label = label;
        }

        public String getLabel() {
            return label;
        }

    }

    public static void main(String[] args) {
        for (Judge judge : Judge.values()) {
            System.out.println(judge.getLabel());
        }
    }
}
合格
不合格

列挙型は特殊なクラスらしく、このような使いかたができるそうです。

スポンサーリンク

おすすめQAサイト

エンジニア特化型Q&Aサイト【teratail(テラテイル)】:
このサイトはプログラミング特化型のQAサイトです。ソースを見やすく整形させた状態で表示させることが出来ます。