Java中C风格静态变量的模式?

Pattern for C-style static variables in Java?

在Java中创建C风格静态变量的最佳方法是什么(本地到方法)?

我有一个方法,我只需要计算一次变量,而不需要在对象的生命周期内重新计算它。

我知道我可以创建一个最终字段,但是在所有情况下,这个变量可能都不是必需的,并且只有当客户机调用了有问题的方法时才需要。

关于我怎样才能做到这一点有什么建议吗?


C++静态局部与懒惰初始化的静态字段相等。

C++:

1
2
3
4
5
6
class Example {
 public:
  void method() {
    static Something something;
  }
};

爪哇:

1
2
3
4
5
6
public class Example {
    private static Something something;
    public void method() {
        if (something == null) something = new Something();
    }
}

local to a method
for the lifetime of the object

对于我来说,这两个句子在Java世界中是互斥的。您需要一个方法或实例变量的局部变量。从你所说的判断,你想要后者。要初始化它,您可以使用懒惰的加载模式,该模式将在需要时(并且仅在需要时)初始化它。缺点是检查其他方法是否已初始化。

在爪哇做事情并不是最好的主意。


我将在调用这个东西的任何地方使用惰性初始化。局部记忆如果经过深思熟虑,会比将其分布到多个类上造成更少的混乱。

如果需要共享,那么for-the-rest无状态服务中的惰性静态初始化比单例服务更好。如果缓存/内存化是本地的(并且是适当的),那么它不会破坏"无状态"的心理图,这有助于保持代码的整洁。

然而,缓存/内存化是一个很难测试的问题。但是模拟无状态bean很简单,并且独立地验证缓存的工作也很容易。


我认为您可能指的是"懒惰缓存"类型的策略。这样地:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class LazyCacheExample {

    Integer x = null;

    public Integer calculateX() {
        // if x has not been calculated yet, calculate it now
        if (null == this.x) {
            // TODO consider thread safety here...
            this.x = 2+2;
        }

        // otherwise return the calculated object
        return this.x;
    }  
}

使用延迟加载模式。