所以我在写游戏时遇到了一个难题,我认为反射可能是更好的解决方案。但是知道不鼓励反射并且我的其他解决方案看起来不那么漂亮,我想我会在这里问一下,看看在这种情况下实际上什么是更好的主意。
基本上我有一个抽象卡片类,并且会有它的几个实现。我有一个案例,我得到了一个卡片名称并且需要构造它的一个对象,只需给出名称即可。
我知道我可以使用:
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/