我可以用反射更简单地做到这一点。我是不是该?

时间:2013-12-12 04:32:58

标签: java reflection factory

所以我正在写一个游戏,我遇到了一个难题,我相信Reflection可能是一个更好的解决方案。但是我知道反映是不受欢迎的,而我的另一个解决方案看起来并不那么漂亮,我想我会在这里问一下,看看在这种情况下什么是更好的主意。

基本上我有一个抽象卡类,并且会有几个实现。我有一个案例,我给了一个名片,需要构建一个对象,只是给出了名字。

我知道我可以使用:

a)反映和使用forName并调用。这将是非常短的代码,可以很好地扩展,并且易于编写。也就是说,这是反思,当我不特别需要时,我就是为了避免它。

b)使用Factory设计模式,然后进行巨大的条件检查,根据我提供的名称调用相应的类。编写起来并不困难,但需要不断的维护,并且需要一段时间才能编写,而且编程也不会很好。也就是说,它是一种非反射解决方案。

那么理想的解决方案是什么?我只是使用Reflection,因为它使我的代码保持良好和简短吗?

2 个答案:

答案 0 :(得分:2)

这是另一种选择(不确定它是否是你提到的“理想解决方案”,但我认为值得考虑):枚举类型。它仍然是一个巨大的列表,但也许更清洁?你必须在某处定义它们。

我的意思的一个例子:

enum CardType {
  CARD_ONE(new Card(arg0, arg1, arg2, ..., argN)),
  CARD_TWO(new Card(arg0, arg1, arg2, ..., argN)),

  ...

  CARD_N(new Card(arg0, arg1, arg2, ..., argN));

  private final Card card;

  private CardType(Card card) {
    this.card = card;
  }

  public Card getCard() {
    return card;
  }
}

然后当你需要通过名字获得一个时,只需:

public Card getCardByName(String cardName) {
  return CardType.valueOf(cardName).getCard();
}

这假设卡片是单片,但你可以轻松地使getCard方法做某种工厂逻辑来创建一个新的。

答案 1 :(得分:1)

我建议使用工厂模式并使用像Spring这样的预构建工厂,您可以使用它来定义bean实例,而不是实现自己的工厂。它可以更容易扩展,因为您可以在XML或带注释的Java代码中定义更多bean类型。只要确保你使用非单例bean,每次你向spring工厂询问一个名字的bean,它都会正确地调用构造函数。它甚至可以让你在同一时间免费进行依赖注入。