2010-11-01 53 views
4

我正在開發一個使用Java/JSP的Web應用程序。 一個班,說學生,有一個靜態成員 static private int _nextID;Java類的範圍靜態成員

我想知道,如果這_nextID在所有用戶會話中是相同的?或者每個會話都有自己的_nextID?

回答

6

在簡單情況下,你可以假設的Student多個實例將共享相同的靜態nextID場。但是,除了簡單的情況之外(或者你沒有的文件),你應該思考。在這種情況下,除非來自nextID計數器的實例id字段傳播到更大的應用程序,其中的ID應該是唯一的,否則沒問題。在這種情況下,你需要一個更強大的ID生成器(也許你想要一個UUID;也許你想要一個數據庫中的主鍵;也許別的東西)。

請仔細詢問自己所需的唯一ID的範圍。然後尋求解決方案,解決這個問題並在課堂上記錄下來。

一般而言,相同命名的類內的靜態字段,但加載由不同類加載器(在相同或在不同的JVM)可以是different instances, something people most often notice when trying to implement the Singleton pattern。所以你的靜態變量的範圍取決於(在複雜的情況下)相關的類加載器。關於Java namespaces defined by classloader is herehere的更多(最近)詳細信息。

SO相關:Difference between Thread.getContextClassLoader()...

+0

說明:*由不同的類加載器加載* - 如果會話分佈在不同的JVM中,幾乎可以肯定的是靜態數據將不會像預期的那樣被共享(我不會驚訝地發現一些專業分佈式緩存/ classloader counter-example ...)。 – 2010-11-01 19:12:37

0

這取決於您的應用程序容器和配置。

靜態成員對於在JVM實例中運行的所有會話都是相同的,但是您的配置可能正在創建多個實例。

如果你想保持這種一致性和便攜性,你不應該依賴它在所有會話中都是相同的。如果需要,這也可以允許您擴展到多臺機器,而無需更改此代碼。

+1

-1不正確;靜態實例是每個類加載器,而不是每個應用程序/ JVM – sleske 2010-11-01 18:56:56

+0

好點,這就是我的意思,但輸入了錯誤的東西。感謝您的糾正,看起來像別人有一個答案。 – 2010-11-01 18:57:57