我正在开发一个棋盘游戏,其中涉及将棋子放入单元格中。要注意的是,只要没有对手的棋子,您就可以将棋子放在棋盘的任何位置(包括占用的单元格)。

现在,我考虑了两种替代方法:


没有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:


片段级代码段

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/

10-12 17:27