2012-05-17 49 views
0

我在這裏有點困惑,建立一個具有選項卡表單的web應用程序。在選項卡表類中,我使用數據成員 - 靜態字符串變量來存儲用戶選擇的選項卡。我這樣做是爲了當用戶返回到選項卡時,我可以顯示用戶最後選擇的選項卡。我正在得到理想的結果。但是,如果我註銷並登錄(在瀏覽器上刪除緩存後),選項卡仍然會選擇用戶上次選擇的選項卡,而不選擇默認選項卡。該選項卡表由另一個組件初始化。我不明白的是,班級的定義是不是垃圾收集?爲什麼選擇舊數據?如何解決這個問題?使用靜態字符串變量的Java類

+0

向我們展示您的代碼會很有幫助,但我認爲您的問題在於使用「靜態」作用域成員,該成員是在該類的實例之間共享的成員,例如可以通過更改每個類的實例。 – birryree

+0

這與垃圾收集無關,並且與您的程序中的錯誤無關。首先,不要爲此使用靜態變量,而應該僅使用實例變量。你在這裏使用靜態的基本原理是錯誤的。 –

回答

2

你似乎認爲製作一個變量靜態某種程度上相當於將它隔離到一個用戶會話。它沒有。

如果你想要任何類型的會話處理,你將不得不實際有一個會話。 (你需要考慮在服務器重新啓動,多個服務器等,會發生什麼)

當你有一個靜態變量,那是在該類加載該類一個變量。它沒有什麼與用戶做。 所有用戶將看到相同的變量,如果他們擊中相同的服務器。

您還沒有告訴我們任何關於您使用什麼技術來構建您的Web應用程序的情況,但基本上應該根據服務器端用戶會話來查看提供給您的內容 - 或者使用隱藏字段傳播信息或類似的東西,所以服務器根本不需要跟蹤它。

1

靜態成員按類存儲,而不是按對象存儲,因此靜態成員的值在所有類實例(對象)中都是相同的,並且在實例超出作用域時不會「重置」。以這種方式使用靜態成員不是一個好主意,因爲應用程序的所有用戶都會看到相同的值,並且如果其中一個導致它發生更改,則每個人都會看到更改的值(即,如果用戶1更改了選項卡,該選項卡也會更改爲所有其他用戶)。

+0

謝謝,這清除了我的疑惑。 – Madz

0

僅僅因爲您清除瀏覽器緩存,它不會影響服務器上存儲您的靜態變量的對象。如果用戶註銷(或登錄,您的選擇),則需要明確重新設置它。

0

如果值不斷變化,它不是靜態的。我想你應該看看使用不同的機制來存儲這些變量。