有没有一种方法可以构建监听器来检测日期是否仍然传输到变量,如果是,则执行一项操作,何时不执行其他操作?
例如
直到“int counter1”增加设置 boolean 值(true)或打印或更改另一个int为1
int 计数器(不再增加或减少)设置 boolean 值(假)打印不同的东西,将另一个 int 更改为 2。
基本上,变量改变加或减,做一件事停止改变做另一件事再次开始改变回到做第一件事等等。
有办法做到这一点吗? 没有明显的整个 if 语句的编译方式。
最佳答案
手工制作
最简单的方法是通过 getter 和 setter 访问该变量。您可以将首选逻辑放入 setter 中并从那里跟踪所有突变。
public class Main {
static int observable = 0;
static void setObservable(int newValue) {
if (observable != newValue) {
System.out.printf("Observable int has been changed from %d to %d.%n", observable, newValue);
observable = newValue;
}
}
public static void main(String[] args) {
observable = 1; // Nothing notified us that value has been changed
setObservable(2); // Console output 'Observable int changed from 1 to 2.'
}
}
内置解决方案
还有很多其他方法可以实现相同的功能:使用 getter 和 setter 创建实际的 java bean,实现 observable and observer interfaces自行或使用现成的内置解决方案,例如 IntegerProperty
:
IntegerProperty intProperty = new SimpleIntegerProperty();
intProperty.addListener((observable, oldValue, newValue) -> {
if (!oldValue.equals(newValue) ) {
System.out.printf("Value has been changed from %d to %d!%n", oldValue.intValue(), newValue.intValue());
}
});
intProperty.setValue(1); // Output: Value has been changed from 0 to 1!
intProperty.setValue(2); // Output: Value has been changed from 1 to 2!
intProperty.setValue(2); // No output
System.out.println(intProperty.intValue()); // Output: 2
停止改变
至于“停止改变”监听器,这是一个更复杂的问题。根据具体情况,我能想到几种可能的解决方案:
1) 如果您的循环是可预测的并由您决定,只需根据需要手动编写逻辑
/* listening for changes up there */
System.out.println("I'll go get some coffee");
Thread.sleep(60000); // stopped changing, eh?
/* do your stuff */
/* Continue listening for changes below */
2) 如果你的循环是不可预测的,但由你设计,你可以尝试让它更可预测一点,设计一组要遵循的规则和协议(protocol),例如,如果新值恰好为零,系统将暂停并切换到另一个任务
3)您还可以运行后台任务,该任务将定期检查上次更新时间,以确定系统是否空闲
有很多可能的解决方案可供建议,但在不了解更多细节的情况下,我无法提出更具体的解决方案
关于java - 计数器监听器直到变量发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46698364/