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

时间:2010-08-30 23:20:35

标签: java design-patterns static

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

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

我知道我可以创建一个final字段,但是在所有情况下可能都不需要此变量,只有在客户端根本调用此方法时才需要此变量。

关于如何实现这一目标的任何指示?

5 个答案:

答案 0 :(得分:4)

C ++静态本地等效于具有延迟初始化的静态字段。

C ++:

class Example {
 public:
  void method() {
    static Something something;
  }
};

的Java:

public class Example {
    private static Something something;
    public void method() {
        if (something == null) something = new Something();
    }
}

答案 1 :(得分:1)

我会在调用此东西的地方使用延迟初始化。如果仔细考虑,本地记忆会产生比在多个类上分发更少的混乱。

如果你需要共享,那么对于其余无状态服务而言,懒惰的静态初始化优于Singleton。如果缓存/ memoization是本地的(并且是适当的),它不会破坏“无状态”的心理图片,这有助于保持代码清洁。

然而,缓存/ memoization是一个痛苦的测试。但是模拟无状态bean是微不足道的,并且独立验证缓存也很容易。

答案 2 :(得分:1)

  

方法的本地   
对于物体的寿命

对我来说,这两个句子在java世界中是互斥的。您要么需要方法或实例变量的本地变量。从你说的话来看,你想要后者。要初始化它,你可以像已经说过的那样使用延迟加载模式,它将在你需要的时候初始化它。缺点是检查其他方法是否已初始化。

用Java做事C方式并不是最好的想法。

答案 3 :(得分:0)

使用Lazy Load模式。

答案 4 :(得分:0)

我认为你可能指的是“懒惰缓存”类型的策略。像这样:

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;
    }   
}