javaの "郷" を知らないおいらは悩める子羊ちゃん - 関数ポインタがない事に対抗する


「オブジェクト と メソッド名の文字列を渡してリフレクションする」って、Javaのポリシー的にどうなんじゃろう……。 やっぱりあんまり良くないのかしら…

class Food{ public void mix(Food f){}; };
class 乳酸菌 extends Food{};
class 卵焼き extends Food{};
class スコーン extends Food{};
class ほうじ茶 extends Food{};

interface FoodGiver
{
    int toSuigintou(Food food);
    int toKanaria(Food food);
    int toSuiseiseki(Food food);
    int toSouseiseki(Food food);
};

void optimizeFood(Food f)
{
    class 謎ジャム extends Food{};
    f.mix(new 謎ジャム());
}

int invokeGive(FoodGiver g, String strName, Food f)
{
    int r = 0;
    
    try
    {
        // food に共通のアクションを加える
        optimizeFood(f);
        
        // んで実行
        Method fn = g.getClass().getMethod(strName, Food.class);
        r = (Integer)fn.invoke(fn, f);
    }
    catch(NoSuchMethodException e){}        // 想定済み
    catch(InvocationTargetException e){}    // 想定済み
    catch(IllegalAccessException e){}       // 想定済み
    
    return r;
}

int invokeSuigintou(FoodGiver g){
    return invokeGive(g, "toSuigintou", new 乳酸菌());
}

int invokeKanaria(FoodGiver g){
    return invokeGive(g, "toKanaria", new 卵焼き());
}

int invokeSuiseiseki(FoodGiver g){
    return invokeGive(g, "toSuiseiseki", new スコーン());
}

int invokeSouseiseki(FoodGiver g){
    return invokeGive(g, "toSouseiseki", new ほうじ茶());
}

C# なら delegate があるからがんばれるんだけどなぁー