Java 如何避免这种情况发生?

Java 如何避免这种情况发生?,java,oop,design-patterns,polymorphism,Java,Oop,Design Patterns,Polymorphism,我当前在Player.java中的代码如下: public boolean canPutCard(Card card) { if (!handCards.contains(card)) { return false; } if (card instanceof ActivableCard) { boolean hasEmpty = false; int i = card

我当前在Player.java中的代码如下:

    public boolean canPutCard(Card card) {
        if (!handCards.contains(card)) {
            return false;
        }
        if (card instanceof ActivableCard) {
            boolean hasEmpty = false;
            int i = card instanceof CharacterCard ? 0 : 1;
            for (int j = 0; j < fieldCards[i].length; ++j) {
                if (fieldCards[i][j] == null) {
                    hasEmpty = true;
                }
            }
            if (!hasEmpty) {
                return false;
            }
        }
        return (card instanceof LandCard && !hasPutLandCard) || (card instanceof PoweredCard
                && ((PoweredCard) card).getPowerNeeded() <= currentElementValue[card.getElementType().ordinal()]);
    }
    public boolean canPutCard(LandCard card) {
        return !hasPutLandCard;
    }

    public boolean canPutCard(PoweredCard card) {
        return card.getPowerNeeded() <= currentElementValue[card.getElementType().ordinal()];
    }

    private boolean canPutCard(int i, PutableCard card) {
        boolean hasEmpty = false;
        for (int j = 0; j < fieldCards[i].length; ++j) {
            if (fieldCards[i][j] == null) {
                hasEmpty = true;
            }
        }
        return hasEmpty;
    }

    public boolean canPutCard(PutableCard card) {
        return canPutCard(1, card);
    }

    public boolean canPutCard(CharacterCard card) {
        return canPutCard(0, card);
    }

    public boolean canPutCard(Card card) {
        return handCards.contains(card);
    }
但是,它肯定不会起作用,因为它不会检查每一个案例


在这种情况下,是否可以避免instanceof而改用多态性?

instanceof操作符通常可以用适当依赖java虚拟分派来代替。将决策逻辑移动到Card类,如下所示

public abstract boolean canPutCard(Player player);
然后在卡子类中实现适当的逻辑,如:

class LandCard extends Card {
    @Override public boolean canPutCard(Player player) {
         return !player.hasPutLandCard() && player.handContains(this);
    }
}

class CharacterCard extends Card implements PoweredCard, PutableCard {
    @Override public boolean canPutCard(Player player) {
         return !player.hasEmptyCharacterCardField() && player.handContains(this);
    }
}

。。。等等玩家类需要有必需的查询方法。

你可以将canPutCard方法作为一个通用方法,但是你的FieldScard至少有两个维度,并且维度依赖于不同类型的卡,我看到一个用于CharacterCard,另一个用于PutTableCard,所以你必须使用instanceof来确定你要查找的维度,另一方面,对于LandCard类型,您有hasPutLandCard布尔属性,这意味着也有instanceof。我不知道泛型方法如何解决这个问题…我想避免在这里使用多个instanceof,因为他们称之为代码气味。。。所有活着看到这些代码的人也是如此,但这不是他们自己决定的。您所要决定的就是如何处理提供给您的代码。。。的确但是,这假设您可以控制层次结构,并且可以修改代码库。如果没有,那么。。。好instanceof可以让你通过。这可以解决问题,但如果玩家本身有卡,而接收卡的玩家作为参数,这不是紧密耦合吗?这不是很糟糕的设计吗?@nafkhanzam如果需要与玩家紧密耦合,你可以制作一个卡作为参数接收的接口,而不是具体的类,你们这里的耦合比以前少了,因为玩家不依赖于卡的层次结构细节
class LandCard extends Card {
    @Override public boolean canPutCard(Player player) {
         return !player.hasPutLandCard() && player.handContains(this);
    }
}

class CharacterCard extends Card implements PoweredCard, PutableCard {
    @Override public boolean canPutCard(Player player) {
         return !player.hasEmptyCharacterCardField() && player.handContains(this);
    }
}