【问题标题】:Static variables in a Java method like in a PHP function behaviour?Java 方法中的静态变量,如 PHP 函数行为中的静态变量?
【发布时间】:2015-02-19 23:50:15
【问题描述】:

知道Java不同于PHP,有没有办法在Java中重构这样的行为?:

在 PHP 中我可以做这样的事情:

function a_function() {
    static $var = "something";
    // do something...
}

在我第一次调用此函数后,对该函数的所有后续调用将导致 $var 根本不会重置为“某物”(其值将在多次调用此函数时保留,即如果该值在执行 // do something... 时,$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
     }

}

您如何看待这种方法,在这种情况下您会怎么做?还有其他方法可以做到这一点吗?

感谢关注!

【问题讨论】:

  • Java 不是 PHP,不要尝试用 Java 编写 PHP。
  • 是的,您可以按照您在第二个示例中显示的方式进行操作。请记住,在多线程情况下,您会遇到该模式的问题。

标签: java static-variables


【解决方案1】:

是的,您可以按照您在第二个示例中显示的方式进行操作。

请记住,在多线程情况下,您会遇到该模式的问题。

作为设计选择,它也不是很优雅。根据您的情况,它很危险且容易出错。

谨慎使用(即:除非您知道自己需要,否则不要这样做)

通常你会希望这样的东西是线程保存和原子的。 如果您还负责同步,则可以使用 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);
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2012-06-24
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多