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

如果你不能修改基类,那么我认为上面是一个合适的实际解决方案。

如果你一致地命名你的类,那么你可以得到原始的类名:

String classname = o.getClass().getClassName();

然后使用实例化一个新类

Class.forName(classname + "MyVersion").newInstance();

(比如说)为每个输入变量创建一个类型的新类实例,并使用公共基类中的方法设置原始对象引用。但是您是否要这样做取决于您有多少变体,和/或该集合在未来发生变化的可能性有多大。

但是,如果您找不到匹配项,我不会返回 null。我宁愿抛出一个明确的异常。

于 2013-08-05T07:56:29.823 回答
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 回答
0

如果您的所有食谱类都派生自基类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 回答