知道Java与PHP不同,有没有办法在Java中重构这样的行为?:
在PHP中我可以做这样的事情:
function a_function() {
static $var = "something";
// do something...
}
第一次调用此函数后,对此函数的所有后续调用都会导致$ var无法重置为"某些内容"所有(它的值将在多次调用此函数时保留,即如果在执行 //执行某些操作时将更改$ var的值,则在后续调用之后, $ var的值将是$ var的最后一个赋值。
我想知道在Java中是否有相同/相似的方法(在Java中声明一个方法中的静态局部变量是不可能的,所以我想我可以通过其他方式实现这一点)。我想过制作一个受保护的或私有的静态字段,并在多次调用方法时使用它(这里有一个布尔的可能方法):
public class A {
protected static boolean isSomething = "false";
public void aMethod() {
// do something... e.g. change the isSomething boolean
// if some condition occurs
}
}
您如何看待这种方法,在这种情况下您会怎么做?还有其他方法可以实现这个目标吗?
感谢您的关注!
答案 0 :(得分:2)
是的,您可以按照第二个示例中显示的方式进行操作。
请记住,在多线程情况下,您将遇到该模式的问题。
作为设计选择,它也不是很优雅。并且根据您的情况,它很危险且容易出错。
小心使用(即:除非您知道需要,否则不要这样做)
通常你会想要这样的东西是线程保存和原子的。
如果您还要处理同步,则可以使用volatile
关键字执行此操作。
public class A {
private static volatile boolean status = true;
public flipStatus() {
synchronized(this) {
status = !status;
}
}
}
更好的是使用java.util.concurrent.atomic
中的Atomic类import java.util.concurrent.atomic.*;
public class A {
private static final AtomicBoolean status = new AtomicBoolean(true);
public boolean flipStatusToTrue() { // return true if value has been flipped
return status.compareAndSet(false, true);
}
public boolean flipStatusToFalse() { // return true if value has been flipped
return status.compareAndSet(true, false);
}
}