java - 从卡的 toString() 获取错误的字符串

标签 java string tostring

当我试图调试一个非常奇怪的并发症时,当我试图从最后一轮失败者那里获得他最高排名的牌并将其拿到我的手上时,就会发生这种情况。

public Card highestRankingCard()
{
    Collections.sort(getHand());

    Card temp = hand.get(hand.size() - 1);

    return temp;
}

打印到 JOptionPane 时我要拿回一套与我手中的东西完全不相关的套装。

JOptionPane.showMessageDialog(null, "You was the first place in last round and " + game.scores().lastRoundLoser().getName() + " was the last.\n Choose a card of rank 3 - 10 to swap with his highest ranking card.\n" + game.scores().lastRoundLoser().getName() + " has given you " + game.scores().lastRoundLoser().highestRankingCard().toString(), "Swap cards", JOptionPane.INFORMATION_MESSAGE);

长代码只是获取失败者的引用,并从他那里调用最高排名卡()。 基本上我所做的就是调用卡的 toString

public String toString()
{
    if(rank == 16)
        return "Black Joker";
    else if(rank == 17)
        return "Red Joker";
    else
    {
        String s = "";

        if(rank == 15)
        {
            s = s + "2";

            if(suit.equals("h"))
                s = s + " of hearts";
            else if(suit.equals("d"))
                s = s + " of diamonds";
            else if(suit.equals("c"))
                s = s + " of clubs";
            else if(suit.equals("s"))
                s = s + " of spades";

            return s;
        }
        else if(rank == 14)
        {
            s = s + "Ace";

            if(suit.equals("h"))
                s = s + " of hearts";
            else if(suit.equals("d"))
                s = s + " of diamonds";
            else if(suit.equals("c"))
                s = s + " of clubs";
            else if(suit.equals("s"))
                s = s + " of spades";

            return s;
        }

        if(suit.equals("h"))
            s = s + " of hearts";
        else if(suit.equals("d"))
            s = s + " of diamonds";
        else if(suit.equals("c"))
            s = s + " of clubs";
        else if(suit.equals("s"))
            s = s + " of spades";

        return s;
    }
}

最后添加的是我从用户那里得到的卡片: 15 是平分的等级还可以,但是钻石的等级呢?这是黑桃,但无论如何我又尝试了一次,我得到了一个更开玩笑的句子。排名不见了!上面的代码是否可以做到这一点?抱歉,如果我遗漏了什么。

注意:由于卡片是绘制的图像,如果它带有文件名,我会注意到的。刚刚检查了一下,没问题

最佳答案

我认为问题不仅仅是没有打印排名。您需要确保代码具有内聚性并最大限度地减少耦合。看起来 toString 方法做了很多它不应该做的工作,对象中的所有内容都应该尽可能只关心该对象实例中包含的信息,并且每个方法都应该专注于做一件事。为什么不将卡片的名称和颜色存储在卡片中,这样只需执行

public String toString(){
    return this.colour + " " + this.name;
} 

而不是试图推断你是哪个卡实例。 你就是卡片。你应该能够从自己那里收集这些信息。最重要的是,良好的编程实践之所以有用,是因为它们可以帮助很多事情,它们可以帮助您进行调试,更多的方法=更多的堆栈跟踪,更窄的可能问题范围,并且它们有助于提高可读性。

抱歉,这可能不是您想听到的,但您可能需要进行一些重大重构才能解决问题。

关于java - 从卡的 toString() 获取错误的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48984045/

相关文章:

java - WebSphere MQ JMS 连接发生错误

java - map 和 reduce 作业可以在不同的机器上吗?

javascript - 如何替换JS字符串中的所有\"?

java - Java 中的 Array.toString 数据处理

kotlin - get()中 “this.toString()”的用途是什么?

java - 让 Java 异常子类的 getMessage() 工作

java - LWJGL 使用纹理时颜色困惑 + 经常禁用纹理时 FPS 较低

java - 如何在SWT中按ENTER设置遍历顺序

javascript - 使用 javascript 在记事本编辑器中返回新行

PHP preg_replace 文本变量