質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

Enumの使い方

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 3,322

score 127

プログラム中にあるマジックナンバーを理解できる形に直そうと思いEnumを使おうとしているのですが、Enumの使い方がわかりません。
例えばプログラムで
if (sum >= 50)
というコードがあるとして、Enumを使おうと以下のような形になるでしょうか?(Enumの使い方が分からずどうしても構文がエラーになってしまうため、だいたいのニュアンスで書いています)
public enum Score {
    Low(50), Middle(100), High(150);
}
そもそも上記のような書き方をするならば、Enumは使わずにpublic static finalの定数でそれぞれを宣言した方がいいのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

Java列挙型
↑のリンクによるとEnumの実体はクラスと不変オブジェクトの集合であるので,その点を留意してコーディングする必要がありそうです.
この中で一番参考になりそうなのが「独自メソッド定義」の節にあるこのコードではないかと思われます.
enum ArgStatus {
    //列挙子の定義は、コンストラクターに合わせた引数を持たせる。
    STAT1(100), STAT2(101), STAT3(102);

    private int value;

    //enum内に定義できるコンストラクターは、privateのみ可能。他はコンパイルエラーになる。
    private ArgStatus(int n) {
        //super("zzz", n);        enumのコンストラクターは、super()を明示的に呼ぶことが出来ない。
        this.value = n;
    }

    public int getValue() {
        return this.value;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/20 07:55

    ご回答ありがとうございます。メソッドを追加するあたりとても参考になりました。
    Enumはクラスと不変オブジェクトの集合なのですね。頭に入れておきたいと思います。ありがとうございました。

    キャンセル

+1

これはstatic finalの使い所ですね。
enumを使うのはCの発想になりますので、Cの経験を豊富にお持ちなのでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/19 10:30

    ご回答ありがとうございます。
    static finalを使ったほうがいいのですね。
    ちなみにCの経験はそれほどありません。

    キャンセル

0

・使い方
下記のようにすれば使えます。
public enum Score {
    Low(50), Middle(100), High(150);

    public final int num;

    Score(int num){
        this.num = num;
    }
}
・enumを使うべきか
変数ではできない型制約を与えるために使うべきです。この場合下記の使い方が間違っています。
if (sum >= 50)
このように使うべきです。
if (sum == Low)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/20 07:51

    ご回答ありがとうございます。使い方が少しわかりました。参考にさせていただきます。

    キャンセル

0

static final より enum をつかうことをお勧めします。
参考情報;
- Effective Java にのっている エレガントな Enum の使い方メモ http://futurismo.biz/archives/2768
- Javaではint定数の代わりにenumを使用する http://promamo.com/?p=4313

質問のケースを enum で書いてみました。
(enum を列挙することは、final static の方法では無理なはず。)

public class EnumSample {
    enum ArgStatus {
        Low(50), Middle(100), High(150);

        private final int val;
        private ArgStatus(int val) {this.val = val;}
        public int getVal() {return this.val;}
    }

    public static void main(String[] args) {
        int sum = 50;
        if (sum >= ArgStatus.Low.getVal()) {
            System.out.println("合格です。");
        } else {
            System.out.println("落第です。");
        }

        for( ArgStatus s : ArgStatus.values()) {
            System.out.println(s.getClass().getSimpleName() + "." + s + ":" + s.getVal());
        }
    }
}
実行結果:
合格です。
ArgStatus.Low:50
ArgStatus.Middle:100
ArgStatus.High:150

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る