Java——许多其他if语句与instanceof条件的替代



我有一段混乱的代码,我真的很想清理它,因为它有大约12个else-if,每个if语句都检查2个对象的instance,所以如下所示:如果(超类的parentObj实例&超类的parentObj2实例)

每个if语句执行的内容都不一样,所以多态性不会让它变得更好。另外,因为这个小功能的12个不同的超类(如果语句执行1行,则大多数超类)会有点可笑。多态性不起作用的另一个原因是我不能访问父类或超类。我知道很多情况通常都不好做,尽管我从来没有真正理解为什么。在每个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
}

Strategy模式似乎非常适合这一点。这是维基百科文章的链接,这应该足以让你开始,因为你提供了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();
}

最新更新