【问题标题】:Pattern for C-style static variables in Java?Java中C风格的静态变量的模式?
【发布时间】:2011-04-06 00:26:47
【问题描述】:

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

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

我知道我可以创建一个 final 字段,但可能并非在所有情况下都需要此变量,并且仅当客户端完全调用该方法时才需要此变量。

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

【问题讨论】:

  • 您可以在什么时间点计算变量值?编译时间/运行时间/方法调用时间?
  • 一句警告:在 C++ 中,类方法中的静态变量在类的上下文中是静态的,而不是在对象实例中。 stackoverflow.com/a/6223689/1741

标签: java design-patterns static


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我会在调用这个东西的任何地方使用延迟初始化。如果经过深思熟虑,本地记忆会比将其分布在多个类中产生更少的混乱。

    如果你需要共享,那么在一个 for rest 无状态服务中的惰性静态初始化比 Singleton 更好。如果缓存/记忆是本地的(并且适当的),它不会破坏有助于保持代码清洁的“无状态”心理图景。

    但是,缓存/记忆化是一种痛苦的测试。但是模拟无状态 bean 很简单,独立验证缓存是否有效也很容易。

    【讨论】:

      【解决方案3】:

      局部于方法
      对象的生命周期

      对我来说,这两个句子在 Java 世界中是相互排斥的。您要么需要方法局部变量,要么需要实例变量。从你说的你想要后者来看。正如有人已经说过的那样,要初始化它,您可以使用延迟加载模式,该模式将在并且仅在您需要它时对其进行初始化。缺点是检查其他方法是否已初始化。

      以 C 方式在 Java 中做事并不是最好的主意。

      【讨论】:

        【解决方案4】:

        使用Lazy Load 模式。

        【讨论】:

        • 他想知道如何为他想在延迟加载中使用的函数创建局部的 c 样式静态变量。这是正确的——但他想要一种方法,不必在污染命名空间的类中创建私有变量。
        • 然后他要求不可能的事;)
        • 一个私有类变量对于以 OOP 方式执行它的代价并不大。私有变量的重点是首先避免命名空间污染。
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-12
          • 2016-02-07
          • 2012-08-17
          • 2011-04-11
          • 2010-10-24
          相关资源
          最近更新 更多