Java 为什么setter不能处理特定的选择?

Java 为什么setter不能处理特定的选择?,java,spring-boot,Java,Spring Boot,很抱歉,标题措词不当,但我不知道如何正确总结这个问题 我创建了一个棋局保存位置的国际象棋游戏。除了国王之外,这些碎片不知道它们的位置。每当国王移动时,它的位置都会用一个简单的setter更新- Gameflow.java public static void movePiece(Player player, int pieceSelection, int action) { int x = pieceSelection / 10; int y = piec

很抱歉,标题措词不当,但我不知道如何正确总结这个问题

我创建了一个棋局保存位置的国际象棋游戏。除了国王之外,这些碎片不知道它们的位置。每当国王移动时,它的位置都会用一个简单的setter更新-

Gameflow.java

    public static void movePiece(Player player, int pieceSelection, int action) {
        int x = pieceSelection / 10;
        int y = pieceSelection % 10;
        Board board = Board.boardConstructor(); //board is a Singleton
        Piece piece = Board.squares[x][y].getPiece();   
        ...
           if (piece.getType().equals(Type.KING)) {              
                King king = (King) piece;
                king.setXY(endX, endY);
                System.out.println("King moved to " + king.getX() + king.getY()); //prints old location
            }
    public static void movePiece(Player player, int pieceSelection, int action) {
            if (piece.getType().equals(Type.KING)) {                
                King king = player.getKing(); // <-- changed how I select the King
                king.setXY(endX, endY);
                System.out.println("King moved to " + king.getX() + king.getY()); //prints correctly
            }
King.java

public class King extends Piece {
    ...
    public void setXY(int x, int y) {        
        this.x = x;
        this.y = y;
        System.out.println("The King's location is now " + this.x + this.y); //prints new location
    }
java中setter中的println按预期输出,但King的位置没有在其他地方更新

我被弄糊涂了,为什么更新的位置没有被保存,但我还是能够通过更改一行来解决这个问题-

Gameflow.java

    public static void movePiece(Player player, int pieceSelection, int action) {
        int x = pieceSelection / 10;
        int y = pieceSelection % 10;
        Board board = Board.boardConstructor(); //board is a Singleton
        Piece piece = Board.squares[x][y].getPiece();   
        ...
           if (piece.getType().equals(Type.KING)) {              
                King king = (King) piece;
                king.setXY(endX, endY);
                System.out.println("King moved to " + king.getX() + king.getY()); //prints old location
            }
    public static void movePiece(Player player, int pieceSelection, int action) {
            if (piece.getType().equals(Type.KING)) {                
                King king = player.getKing(); // <-- changed how I select the King
                king.setXY(endX, endY);
                System.out.println("King moved to " + king.getX() + king.getY()); //prints correctly
            }
publicstaticvoidmovepiece(玩家、整块选择、整块动作){
如果(piece.getType().equals(Type.KING)){
King King=player.getKing();//x.getType()==Type.King.findFirst()
.orElse(空);
返回(国王)国王;
}
我的问题已经解决了,但我一点也不聪明。为什么那会修复我的代码?为什么它不能更早地工作


Piece是一个抽象类,team是一组玩家的棋子。

如果不看
Board
,很难说,但我看到了一些警告信号:调用
Board.boardConstructor()
听起来像是在获得一个新的棋盘,而不是现有的棋盘。您几乎可以肯定正在使用代码中的
棋子的不同实例。尝试用以下代码替换您的代码以获得国王:

King king = player.getKing(); // <-- changed how I select the King
System.out.println(Integer.toHexString(System.identityHashCode(piece) + "\t" 
    + Integer.toHexString(System.identityHashCode(king)));

King King=player.getKing();//Don Hosek指出问题不在哪里,因此我将他的代码插入我的董事会和每个团队。我希望找到一组32个哈希代码打印两次,但结果是64个不同的哈希代码,即两组唯一值

在进一步使用散列码之后,我发现不是每个团队中的片段都在变异,而是董事会上的片段。在第一步之前,它们只变异了一次,这给了我一个关于问题的强有力的线索

与大多数令人困惑的错误一样,答案非常简单。最初,这是一个Java终端游戏,我转移到了Spring/React,在这样做时,我搞乱了初始化顺序


我不知道为什么在棋盘前创建玩家时没有出现更严重的错误(因为所有的棋子都是由棋盘实例化的,所以团队应该是空数组)。无论如何,问题是通过交换前两行代码来解决的。getType()==Type.KING
vs
getType().equals(Type.KING)
可能您没有正确实现
类型的
equals()
方法。我猜piece(在GameFlow中)和player.getKing()不是同一个对象…您如何获得该引用?(piece)这取决于类型的类型……嗯,有趣的是,我没有意识到我在玩家类中使用了地址比较器,但我不认为这是问题,因为它正确地进入了Gameflow中的if块。玩家如何收集他们的碎片?啊,我应该说Board是一个单音是的,它们是不同的。谢谢