小编典典

这是instanceof的可接受用法吗?

java

我正在研究纸牌游戏UNO的实现(主要是运行模拟来测试一些内部规则,但这是不同的事情)。

对于从未玩过的人来说,它类似于疯狂八人组。玩家轮流在弃牌堆上玩纸牌。卡必须在编号或颜色上匹配。也有抽奖牌,迫使下一个玩家抽两张或四张牌。内部规则也非常友好,这使其非常有趣。

我的卡Cardvalue和一起上课color。我想做的是创建DrawCard扩展Card。然后,在确定游戏机制时,我将instanceof用来测试是否具有DrawCard

我知道这instanceof通常是有问题的,但这对我来说似乎还可以。通常情况下,卡片的处理方式相同,只有少数特殊卡片会被不同地对待,并且仅在特定于卡片类型的特殊情况下使用(这似乎有点像草率的话……)

我可以在Card类中使用标记(实际上,每种类型的卡已经具有其自己的“值”),但是Card无论如何,我都在扩展以提供其他类型的卡可能具有的某些方法(这不仅是一种识别方法,
)。instanceof对我而言,使用似乎更通用,因为我不需要知道哪个值value需要这种特殊行为,例如,将Draw 8卡添加到Draw
2和Draw 4的当前内容中会很容易。 (这样让我想知道我是否可以使用某种嵌套枚举之类的东西,但我不知道)

我知道这两种解决方案都可以工作(使程序运行)。对我来说,使用instanceof感觉会更好,但是我没有经验来了解是否还可以。这是不好的设计吗?


阅读 197

收藏
2020-11-26

共1个答案

小编典典

简短的答案:并不是真的可以接受,所以是的-
这是设计缺陷的迹象。instanceof几乎总是有一种气味,除非在极少数情况下,图书馆试图提供某种形式的帮助,这些帮助是元的或其他丑陋的,但有助于克服语言/环境的缺点。

建议使用访客模式。如果您确实在系统中有两种不同的类型,则可能是这样。

您也不必“显式”使用访问者模式,而是将其合并到程序流中。因此,请考虑一个接口卡:

interface Card {
  void pick(Player player);
}

class DrawCard implements Card {
  void pick(Player player) {
    player.draw(value); // assume value passed in e.g. ctor
  }
}
2020-11-26