Class SpecialItemFactory
java.lang.Object
server.specialitem.SpecialItemFactory
特殊道具設定總管(單例),以
itemId 為鍵持有所有 SpecialItemConfig,
供 client.PlayerStats#recalcLocalStats 在角色數值重算時查詢加成。
啟動時(或 !reloadspecialitems / 後台「刷新特殊道具」)自資料表 special_items
讀入全部設定。對外查詢入口 getByItemId(int) 與 isSpecialItem(int) 位於極熱路徑
(recalc 每次換裝/加退 buff/升級皆呼叫,以及背包異動的守門判斷),故採無鎖讀取:
設定快照存於 volatile 不可變 Map,重載時於背景建好新快照後原子換上,
讀取端只讀 volatile 參考、不取鎖、不阻塞。無任何設定時 Map 為空,isSpecialItem(int)
立即回傳 false,對未使用本功能的伺服器零額外負擔。
後台增刪改只寫入資料庫、不自動生效,需經重載才採用新設定(與轉蛋機相同的維護模型)。
-
Method Summary
Modifier and TypeMethodDescriptiongetAll()取得目前全部設定的快照(不可變視圖),供後台清單與重算時遍歷。getByItemId(int itemId) 依道具編號取得設定。static SpecialItemFactory取得單例。booleanisEmpty()目前是否沒有任何特殊道具設定(供熱路徑提前略過)。booleanisSpecialItem(int itemId) 指定道具是否為特殊道具(快速集合判斷,供背包異動的守門用)。voidreload()全量重載所有特殊道具設定。
-
Method Details
-
getInstance
取得單例。採雙重檢查鎖定;首次建立時執行一次全量重載,最後才把建立完成的實例指派給instance(確保其他執行緒看不到尚未載入完成的半成品)。- Returns:
- 特殊道具設定總管單例
-
reload
public void reload()全量重載所有特殊道具設定。先在背景把
special_items每一列讀進暫存 Map,再把它包成不可變 Map 後原子指派給volatile的configs(讀取端無鎖、永遠看到完整快照)。讀取失敗只記錄錯誤、保留原有快取。 -
isEmpty
public boolean isEmpty()目前是否沒有任何特殊道具設定(供熱路徑提前略過)。- Returns:
- 無任何設定時回傳
true
-
isSpecialItem
public boolean isSpecialItem(int itemId) 指定道具是否為特殊道具(快速集合判斷,供背包異動的守門用)。- Parameters:
itemId- 道具編號- Returns:
- 已設定為特殊道具時回傳
true
-
getByItemId
依道具編號取得設定。- Parameters:
itemId- 道具編號- Returns:
- 對應設定,或在未設定時回傳
null
-
getAll
取得目前全部設定的快照(不可變視圖),供後台清單與重算時遍歷。- Returns:
- 所有
SpecialItemConfig的集合
-