2015-10-05 35 views
1

这涉及到以下主题:多少次静态方法将在Java执行

https://stackoverflow.com/questions/18402564/how-do-static-methods-work

假设我在一个类(识别TestClass),其查询数据库并保存它有一个静态方法在一个静态变量中,并返回它。

public static List<MyClass> getMyData() 
    { 
    setMyDataList(getMyNewData.execute());//DB Call and assigns the result to the static variable. 
    return myDataList;// returns the static variable 
    } 

在这种情况下,说A类要求TestClass.getMyData()其获取在myDataList数据并存储,然后B类要求TestClass.getMyData(),将在DB中再次袭来?

+2

每次调用某个方法时,都会调用该方法。如果将结果存储在一个变量中并只访问变量,那么它将成为每次读取的变量。 –

回答

2

静态块不等于静态方法。

In case of static block: 

这时候类加载器加载一个类的静态块负荷。除非您有多个类加载器,否则只能执行一次,并且插入的数据将在所有实例中共享。

Incase of static method : 

它几乎就像一个实例方法,你可以多次打这个方法。差异只是你不需要一个实例来调用它。

你完全不需要那种方法。把你的代码放入一个静态块中,并将其插入到列表中。您可以使用静态方式访问该列表,不要忘记制作该列表static

+1

但是,这是一种方法,我猜不是一个静态块。 – YoungHobbit

+1

@YoungHobbit是的。编辑了一下。感谢您指点。 –

+1

非常感谢您的帮助。这也是我的理解。但只是从其他一些来源弄糊涂了。感谢您的澄清。 –

2

是的,它会被“打”了......

如果你不想,你可能想在你的静态类标志表示如果该方法已经被称为:

private static boolean methodAlreadyCalled = false; 

public static List<MyClass> getMyData() 
{ 
    if (!methodAlreadyCalled) 
    { 
     setMyDataList(getMyNewData.execute()); 
     methodAlreadyCalled = true; 
    } 
    return myDataList; 
} 
+3

如果它被多个线程访问,则可能需要同步。但OP没有提到多线程,所以很好。 – YoungHobbit

+0

是的,这是真的! –