gpt4 book ai didi

Java - 替代许多带有instanceof条件的else if语句

转载 作者:行者123 更新时间:2023-12-02 13:39:25 29 4
gpt4 key购买 nike

我有一段困惑的代码,我真的很想清理它,因为它有大约 12 个 else if,并且每个 if 语句都会检查 2 个对象的 instanceof,所以类似于:if (parentObj 父类(super class)实例 && ParentObj2 父类(super class)实例)

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

编辑:抱歉缺乏细节,我是在手机上写的。无论如何,下面是我正在处理的一个例子。我已经研究过策略模式,我唯一关心的是出于同样的原因,我必须创建许多不同的类,并且我觉得创建许多不同的对象只是为了始终执行 1 个衬垫有点浪费。而且在我看来,在策略设计中,我仍然需要进行许多实例检查才能知道要执行哪个策略。无论如何,下面是一些代码: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
}

最佳答案

策略模式似乎完全适合这一点。 Here是维基百科文章的链接,它应该足以让您开始,并且因为您提供了 0 代码,所以我想我也不会。

但是因为我感觉很好

首先,我会让他们实现一个公共(public)接口(interface)或父类(super class)。这样您就不需要测试它们是什么类型的类。只需让他们调用相同的方法即可。我知道你说过多态性是不可能的,但我不确定为什么。如果您无权访问父类(super class)..创建一个通用接口(interface)。

例如:

// 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();
}

现在让我们定义一些通用接口(interface),Animal:

public interface Animal
{
public void speak();
}

现在您的 instanceof 树如下所示:

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

关于Java - 替代许多带有instanceof条件的else if语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18231983/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com