java - 我真的应该像躲避瘟疫一样避免 instanceof 吗?

标签 java instanceof

我正在开发一款棋盘游戏,其中涉及将棋子放入单元格中。问题是你可以将棋子放置在棋盘上的任何位置(包括被占据的格子),只要那里没有任何对手的棋子即可。

现在我已经考虑了两种替代方案:

  • 没有instanceof:

RedPiece.class 片段

public boolean isAlly(RedPiece p) {
    return true;
}

public boolean isAlly(BluePiece p) {
    return false;
}

public boolean isAlly(GreenPiece p) {
    return false;
}

显然,如果我想添加新颜色,我必须向每个类添加另一个方法。

  • 使用instanceof:

Piece.class 片段

public boolean isAlly(Piece that) { 
    return this instanceof that;
}

后一种方法对我来说似乎更好,因为添加新颜色时我不需要做任何事情。

当然,对于我的游戏来说,这不会成为问题,因为所有部分都是相同的,我可以只创建一个枚举而不是新类。 但如果红队突然被赋予了蓝队和绿队没有的特殊能力怎么办?

也许解决方案是添加一个带有字符串的属性,说明它们属于哪个团队(红色玩家和蓝色玩家),但现在它的设计是红色棋子仅属于红色团队。字符串“RED”绝对是您可以从类中获取的冗余信息。

结论:这里使用instanceof是否合理?谁能想到更好的方法吗?

最佳答案

没有 instanceof 的代码没有多大意义:您将无法将 Piece 作为参数传递给任何方法。

您的带有instanceof的代码无法编译,因为instanceof需要一个类名,而不是一个对象。 我不确定为你的作品创建子类是否是一个好主意。如果您只需要它们具有另一种状态,而不是另一种行为,那么您应该在 Piece 中拥有一个 color 字段。无论如何,您可以简单地通过以下方式实现您想要的内容:

public abstract class Piece {
    public abstract String getColor();

    public final boolean isAlly(Piece otherPiece) {
        return this.getColor().equals(otherPiece.getColor());
    }
}

public class RedPiece extends Piece {
    @Override
    public String getColor() {
        return "red";
    }
}

如果您没有任何 getColor() 方法,则可以使用 this.getClass().equals(otherPiece.getClass()),但这会阻止例如,您可以拥有 BigRedPiece 子类。

关于java - 我真的应该像躲避瘟疫一样避免 instanceof 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590029/

相关文章:

Java,将非静态方法传递给另一个方法

java - 单一职责原则重构

java - 如何删除 <script></script> 标签之间的文本

object - OCaml:类型检查对象

Java:instanceof 方法应该如何看待

Java数组最小值和最大值问题

java - 使用JPA + Hibernate时如何注册自定义String UserType

java - 抽象类 : Why newInstance() is not giving compilation error but constructor call gives error?

javascript - instanceof 在 javascript 中的奇怪输出

javascript - 在事件触发器上借助函数(动态)创建对象的实例