再次重申什麼Timothy Truckle說,你應該遠離單身儘可能遠。
在Web應用程序,靜態字段隱含有應用範圍,因爲每個Web應用程序從他人通過單獨的類加載器隔離。也就是說,您的示例購物車將在同一個Web應用程序的所有會話/用戶之間共享。這通常不是你想要的。
爲每個會話的購物車,你可以使用SingletonUtil
到
喜歡這樣
SoppingCart cart = SingletonUtil.getSessionInstance(ShoppingCart.class);
或
SoppingCart cart = SingletonUtil.getUniqueInstance(ShoppingCart.class, session);
第一個變種使用當前 UI會議 - 分配給當前正在執行的請求線程的那個。
第二個變體要求您提供應該獲取/創建單身人士的UI會話。例如,如果您使用此功能,則可以通過從UI會話啓動的後臺線程運行代碼。
UISession session = RWT.getUISession(display);
Thread thread = new Thread(this::calcualteItemsInShoppingCart);
thread.start();
void calculateItemsInShopingCart() {
SoppingCart cart = SingletonUtil.getUniqueInstance(ShoppingCart.class, session);
// use cart...
}
一般來說,使用(會話/應用程序)單例只能作爲最後的手段。他們遲早會成爲負擔。儘量設計您的代碼,以便您可以在入口點創建購物車或示例,並將其傳遞到需要訪問的代碼部分。
注意,在RAP,可以存在每servlet會話多個UI會話(每個瀏覽器窗口/標籤之一)。
又見RAP文檔的Singletons and Static Fields in RAP章。
這是否回答你的問題?
簡而言之:你根本不應該使用靜態變量。該框架以某種方式爲您提供*會話範圍容器對象*(我不知道RAP)。而且你應該使用它來處理當前調用中存在的任何事情,並且不需要保存在數據庫中。 –