如何处理“代码片段”或方法的一次性执行?

时间:2011-11-15 15:30:09

标签: java performance

我经常遇到这种情况。

class A{
  public static boolean flag = true;

  public void method(){
    // calls method in class B
    B b = new B();
    while(someCondition){
      b.method();
    }
  }
}

class B{

    public void method(){
      if(A.flag){
        // Read all data from a flat file and store it in HashMAp/ArrayList etc 
        //only for the first time
        A.flag = false;
      }
      // Manipulate the data
   }
}

我似乎经常在完全不同的情况下遇到这种情况。

这是正常处理方式吗?我觉得使用静态变量和if语句来解决问题有点愚蠢和不自然。

在这种情况下,我不希望每次执行方法时都通过读取数据来产生开销。

4 个答案:

答案 0 :(得分:3)

看起来你需要 Singleton Pattern 。找出第一次使用时需要加载的数据B,并将其打包到一个单独的类中,该类用作单例实例。有关如何在Java中实现单例模式的更多信息,请参阅this link

遵循此模式,您可以避免每次调用method时检查标记,并且可以同时避免任何线程问题(如果有)。

答案 1 :(得分:2)

正如John B所指出的那样,对null的简单检查应该足够而不是使用标志。如果线程安全成为问题,您也可以查看Guava的CacheBuilderSuppliers.memoize()以了解这些类型的情况。

答案 2 :(得分:1)

不是读取外部标志来确定数据是否已经存储,为什么不检查数据存储以查看它是否已填充?或者,如果数据存储很昂贵(DB),则使用本地静态变量而不是其他类中的静态变量。

答案 3 :(得分:1)

您只需检查存储数据的列表/地图是否已通过上一次调用初始化

class A {

  public void method() {
    B b = new B();
    while (someCondition) {
      b.method();
    }
  }
}

class B {

  private List myList;

  public void method() {
    if (myList == null) {
      // Read all data from a flat file and store it in myList
    } 
    // manipulate the data

  }
}