0

簡単に言えば、次のコードがありますが、これを行うより良い方法はありますか?

また、レシピ クラスを変更することはできません。

public static ShapelessRecursiveRecipe convertRecipe(Object o)
{
    //might be a better way to do this
    if(o instanceof ShapedRecipes)
        return new ShapelessRecursiveRecipe((ShapedRecipes)o);
    else if(o instanceof ShapelessRecipes)
        return new ShapelessRecursiveRecipe((ShapelessRecipes)o);
    else if(o instanceof ShapedOreRecipe)
        return new ShapelessRecursiveRecipe((ShapedOreRecipe)o);
    else if(o instanceof ShapelessOreRecipe)
        return new ShapelessRecursiveRecipe((ShapelessOreRecipe)o);
    else
        return null;
}
4

4 に答える 4

0

すべての Recipes-classes が基本クラスから派生しているRecipe場合は、パラメーターとしてRecipe参照を使用できます。

public static ShapelessRecursiveRecipe convertRecipe(Recipe o)
{
return new ShapelessRecursiveRecipe(o);
}

コンストラクターでオブジェクトのタイプを確認できます。または、それらのメソッドのみを呼び出す場合は、ポリモーフィズムが各サブクラスのメソッドを自動的に呼び出します。

于 2013-08-05T08:35:47.127 に答える
0

別の方法として、次のようなジェネリックを使用する方が良いかどうかはわかりません...

static <T extends ShapedRecipes>  ShapelessRecursiveRecipe convertRecipe(T obj) {
  return new ShapelessRecursiveRecipe(obj);
}

static <T extends ShapelessRecipes> ShapelessRecursiveRecipe convertRecipe(T obj) {
  return new ShapelessRecursiveRecipe(obj);
}

static <T extends ShapedOreRecipe> ShapelessRecursiveRecipe convertRecipe(T obj) {
  return new ShapelessRecursiveRecipe(obj);
}

static <T extends ShapelessOreRecipe> ShapelessRecursiveRecipe convertRecipe(T obj) {
  return new ShapelessRecursiveRecipe(obj);
}
于 2013-08-05T09:44:48.357 に答える
0

私が考えることができる唯一の代替案は、かなり複雑で、熟考を伴うものです。有効なクラスをセットに配置できます。

private static final Set<Class<?>> validClasses = new HashSet<Class<?>> ();

static {
    Collections.addAll(validClasses, ShapedRecipes.class,
                                     ShapelessRecipes.class
                                     ShapedOreRecipe.class); //etc.
}

次に、instanceof を次のようなものに置き換えることができます。

if (o != null && validClasses.contains(o.getClass())) {

最後に、キャストを直接行うことはできませんが、リフレクションを使用して適切なコンストラクターにアクセスできます。

Constructor<ShapelessRecursiveRecipe> constructor =
             ShapelessRecursiveRecipe.class.getConstructor(o.getClass());
constructor.newInstance(o);

私はそれをテストしていませんが、動作するはずです。

それがあなたのコードをより良くするかどうかは議論の余地があります - おそらくそうではありません。

于 2013-08-05T08:07:08.530 に答える