java - 我可以用 Reflection 做的更简单。我是不是该?

标签 java reflection factory

所以我在写游戏时遇到了一个难题,我认为反射可能是更好的解决方案。但是知道不鼓励反射并且我的其他解决方案看起来不那么漂亮,我想我会在这里问一下,看看在这种情况下实际上什么是更好的主意。

基本上我有一个抽象卡片类,并且会有它的几个实现。我有一个案例,我得到了一个卡片名称并且需要构造它的一个对象,只需给出名称即可。

我知道我可以使用:

a) 反射(reflection)并使用 forName 和 invoke。它将是非常短的代码,可以很好地扩展,并且很容易编写。也就是说,它是反射,我完全赞成在我不是特别需要它时避免它。

b) 使用工厂设计模式,然后进行巨大的条件检查,根据我提供的名称调用适当的类。编写起来并不难,但需要不断维护,编写起来需要一段时间,而且扩展性不好。也就是说,这是一种非反射解决方案。

那么理想的解决方案是什么?我使用反射只是因为它使我的代码简洁明了吗?

最佳答案

这是一个替代方案(不确定它是否是您提到的“理想解决方案”,但我认为值得考虑):枚举类型。它仍然是一个巨大的 list ,但也许更干净一些?而且你必须在某个地方定义它们。

我的意思的一个例子:

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 方法执行某种工厂逻辑来创建新卡片。

关于java - 我可以用 Reflection 做的更简单。我是不是该?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20535093/

相关文章:

java - 使用 JAXB 生成随机实例

java - 如何在没有 HSSFWorkbook 实例的情况下设置单元格样式?

c# - 如何比较两个对象之间的属性

c# - 通过反射获取 Private Func<T> 成员

javascript - 如何将 Rails current_user 传递给 AngularJS 工厂 API 调用?

java - 工厂设计模式和DAO设计模式有什么区别

java - Java 中独立于系统的机器关闭

Java - 将 List<Field> 解析为字符串

c++ - 错误 : expected constructor, 析构函数,或 '(' token 之前的类型转换

java - 可变速率消费者的负载平衡队列