我经常遇到这种情况。
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语句来解决问题有点愚蠢和不自然。
在这种情况下,我不希望每次执行方法时都通过读取数据来产生开销。
答案 0 :(得分:3)
看起来你需要 Singleton Pattern 。找出第一次使用时需要加载的数据B
,并将其打包到一个单独的类中,该类用作单例实例。有关如何在Java中实现单例模式的更多信息,请参阅this link。
遵循此模式,您可以避免每次调用method
时检查标记,并且可以同时避免任何线程问题(如果有)。
答案 1 :(得分:2)
正如John B所指出的那样,对null
的简单检查应该足够而不是使用标志。如果线程安全成为问题,您也可以查看Guava的CacheBuilder和Suppliers.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
}
}