0

コーディング中の Enum の読みやすさがとても気に入っています。最近、キーワードのリストを受け入れる必要があり、それぞれがアクションを実行するタスクに出くわしました。

キーワードの例: BREAKFAST、LUNCH、DINNER

だから私はこのようなものを書くことができるようにしたいと String whatImGoingToMake = Keywords.BREAKFAST("banana").getPopularRecipe(); 思います. ここでのアイデアは、バナナを材料として使った人気の朝食レシピを手に入れることです. リフレクションを使用すると機能するはずだと考えたので、これを考えました。

問題は、 getPopularRecipe() が静的ではなく、内部クラスでは許可されていないため、呼び出すことができないことです。

列挙型にこのようなことを強制し、代わりにクラスを使用することは一般的ではないというのは正しいですか? 次のコーダーがやって来てこれを理解するための最も簡単な実装は何ですか?

ここで遅いからかもしれませんが、私はこの時点で苦労しています。

可能であれば、IF ステートメントまたは switch ステートメントの長いリストから離れようとしています。私はそれらを見るのが好きではなく、どんな犠牲を払っても避けています。だから私は次のようなものを書きたくありません:



    if (param.equals("BREAKFAST") {
       //lookup in breakfast db
    } else if (param.equals("LUNCH") {
       //you get the idea - I dont like this since it can go on forever if we start adding BRUNCH, SUPPER, SNACK
    }

仕事に取り掛かることに興味がある列挙型は次のとおりです。



    public enum MyUtil {
        BREAKFAST {
            public String getPopularRecipe(String ingredient) {
                //do something with ingredient
                return recipe;
            }
        },
        LUNCH {
            public String getPopularRecipe(String ingredient) {
                //do something with ingredient
                return recipe;
            }
        }
    }

4

2 に答える 2

3

あなたの質問を正しく理解できれば、Enum にabstractメソッドが必要でありgetPopularRecipe()、すべての enum インスタンスをオーバーライドする必要があります。

例:

public enum MyUtil {
        BREAKFAST {
            @Override
            public String getPopularRecipe(String ingredient) {
                //do something with ingredient
                return recipe;
            }
        },
        LUNCH {
              @Override       
            public String getPopularRecipe(String ingredient) {
                //do something with ingredient
                return recipe;
            }
        }
      public abstract String  getPopularRecipe(String ingredient);
    }

詳細については、このチュートリアルを参照してください (最後まで読んでください)。

于 2012-12-22T04:20:30.837 に答える
0

あなたは物事を複雑にしすぎています:

public enum Meal {
    BREAKFAST("Bacon and eggs"),
    LUNCH("Salad"),
    DINNER("Steak and veg");
    private final String ingredient;
    Meal(String ingredient) {
        // do whatever you like here
        this.ingredient = ingredient;
    }
    public String getPopularRecipe() {
        return ingredient;
    }
}

コンストラクター、フィールド、およびメソッドは、通常のクラスのものと同じくらい複雑になる可能性があります。列挙型は、多くの人が認識しているよりもはるかに通常のクラスに似ています。それらは不変ではありません(衒学者の注意:参照は最終的なものですが、インスタンスは他のクラスと同じように変更可能です-たとえば、列挙型にはセッターメソッドなどがあります)

于 2012-12-22T05:28:23.313 に答える