簡體   English   中英

Java:從遠處的對象訪問方法的最佳方式

[英]Java: Best way of accessing methods from far away objects

我目前正在開發我的第一個更大的java項目(一個游戲),我只有一些組織問題,只有幾個(~40個)類。
我正在組織我的游戲:

項目組織模型

這對我來說似乎非常有條理,因為每個小班級都被歸類為更大的班級。 顯然,像ObjectHandlerModel這樣的類將包含更多的類,否則它們將毫無用處。

現在我的問題是:當我試圖從GUIDynamicObjects訪問當前的PlayerSettings時(例如,當我試圖獲取播放器的位置以便在畫布上繪制它時),我有創建這樣的長路徑:

int x = gui.engine.model.objHandler.player.playerSettings.getX();

(為此目的,我將大多數參數設置為public 。我也可以使用get() methods使它們可訪問,但這對我來說似乎更無組織)

我的問題是 - 這看起來是正常的還是有更好的方法來解決這個組織問題?

簡短的回答是 - 不,你不會想要一個必須取消引用六個對象才能獲得所需數據的情況。

這可能意味着您將數據和功能分解為類的方式有問題。 您通常希望將必須相互通信的對象組合在一起。

一個實用的建議是,您的對象不必形成樹。 DynamicObjects保持對PlayerSettings的引用可能是有意義的。 這只是一個例子:我不知道你的應用程序中有什么意義,我只想指出你不必將對象關系視為一棵樹。

關於get方法與公共成員:將私有變量與getter和setter一起使用是一種Java約定。 它與可維護性和更改功能中的實現有關。 即使這不能說服你,我認為獲得Java編碼中常見的樣式標准是件好事。

正如Demeter法所建議的那樣,讓你的依賴關系松散耦合並盡可能地忽略其他類,有助於使你的應用程序更易於維護。 減少組件之間的耦合使您能夠快速重構或更改單個模塊/類。

您的GUI不應該知道播放器設置對象的來源,也不應該讓GUI自己獲取信息 - 而是應該將對象注入 GUI。 有許多框架可以為您啟用依賴注入 ,例如Google Guice ,但您也可以通過簡單地將對象作為參數提供給GUI,構造函數或特定的初始化方法來實現簡化版本。

public class MyGUI {
    private PlayerSettings settings;
    //...    
    public void initialize(PlayerSettings settings) {
        this.settings = settings;
    }
    //...
}

此外,嘗試將代碼組織到有意義的包中,並降低包中類的可見性 ,以便無法從“遠處”訪問它們。 僅在包外部公開API以供其他人使用和查看。 這同樣適用於類中的方法和字段; 你不應該使用public字段(除了常量)。 盡可能少地暴露在外面的信息,您將能夠重構您的類(或包)中的代碼,而不會破壞“遠離”的代碼。

清理像這樣的依賴混亂的一種快速方法是使用Google Guava的EventBus。 您可以使用它來發布事件,然后訂閱這些事件的任何事情都會對它們起作用,所有事件都沒有任何組件相互了解或事件來自何處。 它是一種快速有效地解耦並有效管理依賴關系的方法。

如果你想要更優雅的東西,看看反應式編程並探索RxJava。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM