Java中靜態變數的適用場景
阿新 • • 發佈:2019-01-27
Java類中的靜態變數在程式執行期間,其記憶體空間對所有該類的物件例項而言是共享的,有些時候可以認為是全域性變數。因此在某些時候為了節省系統記憶體開銷、共享資源,可以將類中的一些變數宣告為靜態變數,通過下面的例子,你可以發現合理應用靜態變數帶來的好處:
Java程式碼- public class WeekA{
- static class Data {
- private int week;
- private String name;
- Data(int i, String s) {
- week= i;
- name = s;
- }
- }
- Data weeks[] = {
- new Data(1, "Monday"),
- new Data(2, "Tuesay"),
- new Data(3, "Wednesday"),
- new Data(4, "Thursday"),
- new Data(5, "Friday"),
- new Data(6, "Saturday"
- new Data(7, "Sunday")
- };
- public static void main(String args[]) {
- final int N = 10000;
- WeekA weekinstance;
- for (int i = 1; i <= N; i++){
- weekinstance = new WeekA ();
- }
- }
- }
在上面這段程式碼中,沒有將Data weeks宣告為靜態變數,因此當建立WeekA物件時將會得到10 000個weeks物件的副本,這些物件被儲存在記憶體中,但是weeks物件中的資料卻從來沒有被更改過,而且十分穩定。因此,如果能使所有物件共享該資料物件是個不錯的解決辦法,請看下面的程式碼:
- public class WeekB{
- static class Data {
- private int week;
- private String name;
- Data(int i, String s) {
- week= i;
- name = s;
- }
- }
- static Data weeks[] = {
- new Data(1, "Monday"),
- new Data(2, "Tuesay"),
- new Data(3, "Wednesday"),
- new Data(4, "Thursday"),
- new Data(5, "Friday"),
- new Data(6, "Saturday"),
- new Data(7, "Sunday")
- };
- public static void main(String args[]) {
- final int N = 10000;
- WeekB weekinstance;
- for (int i = 1; i <= N; i++){
- weekinstance = new WeekB ();
- }
- }
- }
請注意在類WeekB中,在Data weeks[]之前添加了static關鍵字,將該物件變數宣告為靜態的,因此當你建立10 000個WeekB物件時系統中只儲存著該物件的一份拷貝,而且該類的所有物件例項共享這份拷貝,這無疑節約了大量的不必要的記憶體開銷,同時實現了要完成的系統功能。
那麼是不是我們應該儘量地多使用靜態變數呢?其實不是這樣的,因為靜態變數生命週期較長,而且不易被系統回收,因此如果不能合理地使用靜態變數,就會適得其反,造成大量的記憶體浪費,所謂過猶不及。因此,建議在具備下列全部條件的情況下,儘量使用靜態變數:
(1)變數所包含的物件體積較大,佔用記憶體較多。
(2)變數所包含的物件生命週期較長。
(3)變數所包含的物件資料穩定。
(4)該類的物件例項有對該變數所包含的物件的共享需求。
如果變數不具備上述特點建議你不要輕易地使用靜態變數,以免弄巧成拙。