状态维护变量,一段时间后返回到以前的状态
state maintaining variable which goes back to the previous state after a time
java 中的变量是否有可能在一段时间后恢复到之前的状态 limit.For example:If 我有一个布尔变量说 x 被初始化为 false 后来值被更改为 true.Is 这个变量有可能恢复到它的原始值(即 false) 一段时间后 limit.Can 这可以在不使用计时器的情况下实现,或者是否有任何设计模式来实现此功能。
您可以创建一个 class,例如 BooleanReverts,它具有用于新值、它恢复到的旧值和恢复时间的成员,并使用 setter 方法设置反转。您可能需要一个单独的线程来管理所有计时器并执行回调以实现恢复。
找到一个 class 的小例子,它保持状态并根据超时取消状态。
将此视为 PoC。如果您想在多线程应用程序中使用它,您可能需要对并发访问或可见性进行一些改进。
public static void main(String[] args) throws Exception {
VolatileState volatileState = new VolatileState();
System.out.println("initial: " + volatileState.getState());
volatileState.setState(true, 5);
System.out.println("valid : " + volatileState.getState());
TimeUnit.SECONDS.sleep(10);
System.out.println("reset : " + volatileState.getState());
}
在给定时间内保持状态的class。
class VolatileState {
private long timeSet = Long.MAX_VALUE;
private long timeToLive = 0;
private boolean state;
/**
* Keep the given state for <code>timeToLife</code> seconds.
*/
void setState(boolean state, long timeToLive) {
this.timeSet = System.currentTimeMillis();
this.timeToLive = TimeUnit.MILLISECONDS.toSeconds(timeToLive);
}
boolean getState() {
if (System.currentTimeMillis() > timeSet + timeToLive ) {
state = !state;
System.out.println("state reset to " + state);
}
return state;
}
}
你可以这样使用:
class RevertingBoolean {
private long timeToRevert = Long.MAX_VALUE;
private boolean value;
private boolean defaultValue;
void setDefaultValue(boolean value) {
this.defaultValue = value;
}
void setRevertAfter(long revertAfter) {
this.timeToRevert = System.currentTimeMillis() + revertAfter;
}
void setValue(boolean value) {
this.value = value;
}
boolean getValue() {
if (System.currentTimeMillis() > timeToRevert) {
this.value = this.defaultValue;
timeToRevert = Long.MAX_VALUE;
}
return this.value;
}
}
用法:
RevertingBoolean myBool = new RevertingBoolean();
myBool.setDefaultValue(false);
myBool.setValue(false);
myBool.setRevertAfter(10000); // Revert value in 10 seconds
myBool.getValue(); // false
myBool.setValue(true);
myBool.getValue(); // true
// ... 10 seconds later ...
myBool.getValue(); // false
这里有一个简单的泛型 class 和一个 class 的布尔类型(但你可以使用任何类型)的测试用例,应该符合你的要求
package test;
public class TimeValueVar<T> {
private T originalValue;
private T currentValue;
private long duration;
private long creationTime;
public TimeValueVar(T value, long duration) {
originalValue=value;
currentValue=value;
this.duration=duration;
creationTime=System.currentTimeMillis();
}
public void set(T value) {
currentValue=value;
}
public T get() {
if ((System.currentTimeMillis()-creationTime)>duration) {
return originalValue;
}
return currentValue;
}
}
这里是测试用例
package test;
import java.util.concurrent.TimeUnit;
public class TesttimeBasedValue {
public static void main(String[] args) throws Exception {
long duration =2000;
TimeValueVar<Boolean> boolVal=new TimeValueVar<>(true,duration);
System.out.println("original: " + boolVal.get());
boolVal.set(false);
System.out.println("before duration : " + boolVal.get());
TimeUnit.MILLISECONDS.sleep(duration+1);
System.out.println("after duration : " + boolVal.get());
}
}
java 中的变量是否有可能在一段时间后恢复到之前的状态 limit.For example:If 我有一个布尔变量说 x 被初始化为 false 后来值被更改为 true.Is 这个变量有可能恢复到它的原始值(即 false) 一段时间后 limit.Can 这可以在不使用计时器的情况下实现,或者是否有任何设计模式来实现此功能。
您可以创建一个 class,例如 BooleanReverts,它具有用于新值、它恢复到的旧值和恢复时间的成员,并使用 setter 方法设置反转。您可能需要一个单独的线程来管理所有计时器并执行回调以实现恢复。
找到一个 class 的小例子,它保持状态并根据超时取消状态。
将此视为 PoC。如果您想在多线程应用程序中使用它,您可能需要对并发访问或可见性进行一些改进。
public static void main(String[] args) throws Exception {
VolatileState volatileState = new VolatileState();
System.out.println("initial: " + volatileState.getState());
volatileState.setState(true, 5);
System.out.println("valid : " + volatileState.getState());
TimeUnit.SECONDS.sleep(10);
System.out.println("reset : " + volatileState.getState());
}
在给定时间内保持状态的class。
class VolatileState {
private long timeSet = Long.MAX_VALUE;
private long timeToLive = 0;
private boolean state;
/**
* Keep the given state for <code>timeToLife</code> seconds.
*/
void setState(boolean state, long timeToLive) {
this.timeSet = System.currentTimeMillis();
this.timeToLive = TimeUnit.MILLISECONDS.toSeconds(timeToLive);
}
boolean getState() {
if (System.currentTimeMillis() > timeSet + timeToLive ) {
state = !state;
System.out.println("state reset to " + state);
}
return state;
}
}
你可以这样使用:
class RevertingBoolean {
private long timeToRevert = Long.MAX_VALUE;
private boolean value;
private boolean defaultValue;
void setDefaultValue(boolean value) {
this.defaultValue = value;
}
void setRevertAfter(long revertAfter) {
this.timeToRevert = System.currentTimeMillis() + revertAfter;
}
void setValue(boolean value) {
this.value = value;
}
boolean getValue() {
if (System.currentTimeMillis() > timeToRevert) {
this.value = this.defaultValue;
timeToRevert = Long.MAX_VALUE;
}
return this.value;
}
}
用法:
RevertingBoolean myBool = new RevertingBoolean();
myBool.setDefaultValue(false);
myBool.setValue(false);
myBool.setRevertAfter(10000); // Revert value in 10 seconds
myBool.getValue(); // false
myBool.setValue(true);
myBool.getValue(); // true
// ... 10 seconds later ...
myBool.getValue(); // false
这里有一个简单的泛型 class 和一个 class 的布尔类型(但你可以使用任何类型)的测试用例,应该符合你的要求
package test;
public class TimeValueVar<T> {
private T originalValue;
private T currentValue;
private long duration;
private long creationTime;
public TimeValueVar(T value, long duration) {
originalValue=value;
currentValue=value;
this.duration=duration;
creationTime=System.currentTimeMillis();
}
public void set(T value) {
currentValue=value;
}
public T get() {
if ((System.currentTimeMillis()-creationTime)>duration) {
return originalValue;
}
return currentValue;
}
}
这里是测试用例
package test;
import java.util.concurrent.TimeUnit;
public class TesttimeBasedValue {
public static void main(String[] args) throws Exception {
long duration =2000;
TimeValueVar<Boolean> boolVal=new TimeValueVar<>(true,duration);
System.out.println("original: " + boolVal.get());
boolVal.set(false);
System.out.println("before duration : " + boolVal.get());
TimeUnit.MILLISECONDS.sleep(duration+1);
System.out.println("after duration : " + boolVal.get());
}
}