【问题标题】:Java - alternative to many else if statements with instanceof conditionsJava - 替代许多带有 instanceof 条件的 if 语句
【发布时间】:2013-08-14 12:38:12
【问题描述】:

我有这个凌乱的代码,我真的很想清理它,因为它有大约 12 个 else if,每个 if 语句都会检查 instanceof 2 个对象,比如: if (parentObj instanceof superclass && parentObj2 instanceof superclass)

每个 if 语句都执行不同的操作,所以我认为多态不会让它变得更好。还因为这个小功能有 12 个不同的超类(大多数 if 语句执行 1 个内衬)会有点荒谬。 多态性不起作用的另一个原因是我无法访问父类或超类。我知道许多 instanceof 条件通常不好做,即使我从来没有真正理解为什么。在每个 if 语句中执行的方法不是父类,而是超类,这就是为什么我需要检查它们的类型,以便我可以转换它们并执行这些方法。 关于如何清理它的任何想法? 谢谢!

编辑:对不起,我在手机上写了这个。无论如何,下面是我正在处理的一个例子。我已经查看了策略模式,我唯一关心的是出于同样的原因,我必须创建许多不同的类,并且我觉得创建许多不同的对象只是为了始终执行 1 班轮会有点浪费.在我看来,在策略设计中,我仍然需要进行许多 instanceof 检查才能知道要执行哪个策略。无论如何,下面是一些代码:p

if (plotBlockState instanceof Sign && UpgradeBlockState instanceof Sign) {
    //do Sign Stuff
}
else if (plotBlockState instanceof Chest && UpgradeBlockState instanceof Chest) {
    //do Chest Stuff
}
else if (plotBlockState instanceof Dispenser && UpgradeBlockState instanceof Dispenser) {
    //do Dispenser Stuff
}
else if (plotBlockState instanceof Furnace && UpgradeBlockState instanceof Furnace) {
    //do Furnace Stuff
}
else if (plotBlockState instanceof BrewingStand && UpgradeBlockState instanceof BrewingStand) {
    //do Brew Stand Stuff
}
else if (plotBlockState instanceof Hopper && UpgradeBlockState instanceof Hopper) {
    //do hopper Stuff
}
else if (plotBlockState instanceof Dropper && UpgradeBlockState instanceof Dropper) {
    //do dropper Stuff
}
else if (plotBlockState instanceof Beacon && UpgradeBlockState instanceof Beacon) {
    //do beacon Stuff
}
else if (plotBlockState instanceof CreatureSpawner && UpgradeBlockState instanceof CreatureSpawner) {
    //do spawner Stuff
}
else if (plotBlockState instanceof NoteBlock && UpgradeBlockState instanceof NoteBlock) {
    //do noteblock Stuff
}
else if (plotBlockState instanceof Jukebox && UpgradeBlockState instanceof Jukebox) {
    //do jukebox Stuff
}
else if (plotBlockState instanceof Skull && UpgradeBlockState instanceof Skull) {
    //do skull Stuff
}
else if (plotBlockState instanceof CommandBlock && UpgradeBlockState instanceof CommandBlock) {
    //do commandblock Stuff
}

【问题讨论】:

  • 如果你发布一个SSCCE 来证明你的问题呢?
  • 您能否提供一个代码 sn-p 以便我们更好地了解您的问题?
  • 我担心您将如何处理 plotBlockState 和 UpgradeBlockState 具有不同类型的情况。这种代码,你说“但它必须是同一类型,我知道它是同一类型”,尽管编译器看不出它们是相同的......通常表明设计中有问题
  • 天哪,我有好消息要告诉你:openjdk.java.net/jeps/406

标签: java object instanceof


【解决方案1】:

Strategy 模式似乎非常适合这一点。 Here 是维基百科文章的链接,应该足以让您入门,而且由于您提供了 0 代码,我想我也不会。

但是因为我感觉很好

首先,我会让他们实现一个通用接口或超类。这样您就不需要需要测试它们是什么类型的类了。只需让他们调用相同的方法。 我知道你说过多态是不可能的,但我不知道为什么。如果你无权访问超类.. 制作一个通用接口。

例如:

// Undesirable syntax.
if(obj instanceof Dog)
{
    ((Dog)obj).woof();
}
else if(obj instanceof Cat)
{
    ((Cat)obj).meow();
}
else if(obj instanceof Lion)
{
    ((Lion)obj).roar();
}

现在让我们定义一些通用接口,Animal

public interface Animal
{
    public void speak();
}

现在你的instanceof 树看起来像这样:

public void makeTalk(Animal obj)
{
    obj.speak();
}

【讨论】:

  • 我确实编辑了 OP。但我不能这样做的原因是因为我正在处理的父对象接口(BlockState)不在我的控制范围内,所以我无法编辑它来制作另一个方法声明来做我需要做的事情。跨度>
  • 但是您肯定可以为这些类创建另一个接口吗?这是不可取的,但它肯定比一堆instanceof 操作员要好。
  • 我认为在这种情况下,您可能还需要在适配器模式中添加一点点。如果你需要扩展一堆你不能编辑的类,那么这就是你最终的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2021-10-08
相关资源
最近更新 更多