lambda之外的布尔开关

问题描述 投票:0回答:2

我正在使用JavaFX开发游戏。它几乎已经完成,但我遇到了移动检测的问题,无法想到简单的解决方案。可能有,但我只是没有意识到这一点

显然中间有更多的代码,但我突出了有问题的部分。

int finalX = x;
int finalY = y;
boolean jumpMade = false;
boolean moveMade = false;

// Mouse Controller
board[x][y].setOnMouseClicked(event -> {

    if (!moveMade) {
        move(finalX, finalY, selectedMarbleX, selectedMarbleY, selectedMarbleColor);
        // Here I would want to make moveMade = true;
        // To block further possibility of moving.
    }
}

尝试更改为原子或单元素数组但由于用户正在播放的“地图”有多个可能的移动方向(因此它不会阻止所有这些),因此无法完成工作。

并且通过仅仅放置moveMade = true overhere出现的错误会导致“lambda表达式中的变量应该是最终的或有效的最终”。

java
2个回答
0
投票

如果要访问和修改lambda表达式中的变量,请将其定义为类/实例变量。 There is a genuinely crux reason for the error you shouldn't rule out.

Gobbledygook还是一个简单的例子,

interface Q {
    void fun();
}
class ABC {
    public static boolean x = false;  // class variable
    public static void b(Q q) {
        q.fun();
    }

    public static void main(String[] args) {
        Q a = () -> {
            System.out.println("run simple lambda");
            x = true;
        };
        b(a);
        System.out.println(x);
    }
} 

0
投票

使用java.util.concurrent.atomic.AtomicBoolean实用程序类。它们保存对值的原子线程安全引用。

import java.util.concurrent.atomic.AtomicBoolean;

// Outside of lambda, instantiate the atomic boolean reference
AtomicBoolean ref = new AtomicBoolean(); // Constructor parameter optional: empty (false) / true / false

// Inside lambda, use the getters and setters
ref.set(true); // or: ref.set(false);
© www.soinside.com 2019 - 2024. All rights reserved.