不好的實現

這些不佳的嘗試應該被避免,因為它們可能造成記憶體洩漏 (OutOfMemoryError)、延遲或不一致。

存儲引用

一些實體,像是:

**不應**在插件中儲存或快取。

主因如下:

  • 引用妨礙了適當的垃圾回收

  • 實體可能不再有效

這可以透過相應的快照、儲存相印實體的UUID並在需要時請求一個及時實體來解決。

在主線程上的IO

執行一些IO操作,例如:載入配置/資料、檢查對網站的更新/連接耗費時間並影響伺服器的TPS。這些任務應該在無論是它們自己的線程或內建的異步排程機制上被完成。但若是在伺服器/插件的初始化階段,使用主線來載入所需的檔案/配置便完全沒有問題。

this.game.getScheduler().createAsyncExecutor(this).execute(this::checkForUpdates);

請參閱 :doc:`scheduler <../scheduler>`以獲得更多資訊。

若操作完成的不正確,你可能會發現用戶端超時,甚至伺服器被看門狗計時器停止。

存取主線程外的遊戲物件

存取主線程外的物件可能導致崩潰、不一致及其餘的各種問題,且應該被避免。如果你有一個在不同線程上有較長的操作,使用 :doc:`scheduler <../scheduler>`來改變那些主線程上的遊戲物件。如果你想在不同線程上使用遊戲物件,使用它的快照或分離的容器。

警告

如果出錯,你會收到一個``ConcurrentModificationException``及可能的伺服器崩潰、最糟──玩家/世界/伺服器損壞。