知道 Java 与 PHP 不同,有没有办法在 Java 中重构这样的行为?:
在 PHP 中我可以做这样的事情:
function a_function() {
static $var = "something";
// do something...
}
在我第一次调用此函数后,对此函数的所有后续调用都将导致 $var 根本不会重置为“某物”(其值将在多次调用此函数时保留,即如果该值$var 的值会在执行 //do some... 时发生变化,然后在后续调用之后,$var 的值将是最后分配给 $var 的值。
我想知道在Java中是否有相同/类似的方法可以做到这一点(在Java中的方法中声明静态局部变量是不可能的,所以我想我可以通过其他一些方式来实现这一点)。我考虑创建一个 protected 或私有(private)的静态字段,并在对一个方法的多次调用中使用它(这里是使用 boolean 值的可能方法):
public class A {
protected static boolean isSomething = "false";
public void aMethod() {
// do something... e.g. change the isSomething boolean
// if some condition occurs
}
}
您对这种方法有何看法?在这种情况下您会怎么做?还有其他方法可以实现这一点吗?
感谢您的关注!
最佳答案
是的,您可以按照第二个示例中所示的方式进行操作。
请记住,在多线程情况下,您会遇到该模式的问题。
作为一种设计选择,它也不是很优雅。根据您的具体情况,它是危险且容易出错的。
谨慎使用(即:除非您知道需要,否则不要这样做)
通常您会希望类似的东西是线程保存的和原子的。
如果您还负责同步,则可以使用 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);
}
}
关于java - Java 方法中的静态变量是否像 PHP 函数中的行为一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27593217/