java - Java 方法中的静态变量是否像 PHP 函数中的行为一样?

标签 java static-variables

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

相关文章:

java - org.json JSONObject 在从 Spring Boot Controller 返回时向 JSONObject 添加额外的对象

Java SQL 插入具有自动增量 id 的行

java - Spring Roo应用文件上传路径

Java : com. google.protobuf 不存在

c - 静态变量声明 (C)

c - 在 C 中,有没有一种方法可以确保在没有 pthread_once 的情况下只调用一次函数?

java ReplaceAll 和 '+' 匹配

python - 从类中的静态方法 Python 填充一次静态变量

python - 更改静态类变量

scope - 使用 C 预处理器来确定当前范围?