Java方法中的静态变量,如PHP函数行为?

时间:2014-12-21 20:00:03

标签: java static-variables

知道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
     }

}

您如何看待这种方法,在这种情况下您会怎么做?还有其他方法可以实现这个目标吗?

感谢您的关注!

1 个答案:

答案 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);
   }
}