当前位置: 首页 > 面试题库 >

这是instanceof的可接受用法吗?

巢星纬
2023-03-14
问题内容

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

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

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

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

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

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


问题答案:

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

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

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

interface Card {
  void pick(Player player);
}

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


 类似资料:
  • 问题内容: 我们已经从软件供应商处收到Java代码。它包含许多没有任何部分的块。他们到处都是。例: 我的问题是:以上做法是否可以接受?如果是这样,什么时候?还是我应该继续删除所有这些“虚假” 和陈述? 对我来说,这看起来像是可怕的练习,但是我对Java的经验不足以肯定。如果您不打算对它们做任何事情,为什么会发现它们呢?在我看来,仅当您确信例外绝对不会有后果并且您不在乎是否发生例外时,您才这样做。但

  • 问题内容: 多年来,我尽力避免出现这种情况。在适用时使用多态或访客模式。我想它在某些情况下可以简化维护工作…还有其他应注意的缺点吗? 但是我确实在Java库中到处都看到它,所以我想它有它的位置吗?在什么情况下更可取?是否不可避免? 问题答案: 我可以想象某些情况,例如您有一个库的对象,您无法扩展这些对象(或者这样做很不方便),也许与您的某些对象混合在一起,这些对象都具有相同的基类,并且一起采集。

  • valgrind快速启动页面提到: 这将我引向这样一个问题:是否有充分的理由不在生产中从程序中消除这样的错误?发布包含此类错误的程序有什么好处吗?如果有,开发人员如何保护它的安全,尽管据我所知,包含此类错误的程序可以不可预测地运行,并且无法对其行为做出一般假设?如果是这样,你能提供真实世界的例子,说明程序运行时有这些错误比没有错误更好吗?

  • 我有一个可以工作的DM命令,但如果我尝试DM一个关闭了DMs的人,会给出以下错误: 我如何让它检查用户是否打开了DMs?

  • 我在接受Android SDK构建工具28.0.3的许可时遇到了问题。在Gitlab上运行时会出现。

  • 问题内容: 我的一些数据是64位整数。我想将它们发送到页面上运行的JavaScript程序。 但是,据我所知,大多数JavaScript实现中的整数都是32位有符号数。 我的两个选择似乎是: 将值作为字符串发送 将值作为64位浮点数发送 选项(1)并不完美,但选项(2)似乎不那么完美(数据丢失)。 您如何处理这种情况? 问题答案: 似乎这与JSON无关紧要,而与Javascript本身有关。您打算