2014-06-12 62 views
0

我有一個公共單元類。我只想訪問GeofenceUnit類THROUGH單元類。因此,我使GeofenceUnit成爲Unit的內部類。一個單位有許多GeofenceUnits。因此,當我實例化一個單元時,我想在單元對象中存儲很多GeofenceUnits。從外部類非靜態構造函數訪問內部類的靜態方法

public class Unit { 
    public ArrayList<Unit.GeofenceUnit> geofences; 

    public Unit(int id){ 
    this.id = id; 
    geofences = this.geofence.fill(); 

    } 

    private static class GeofenceUnit { 
    ArrayList<GeofenceUnit> geofences; 
    private static ArrayList<Unit.GeofenceUnit> fill(){ 
     ... 
     while(resultSet.next()){ 
     geofences.add(new Geofence()); 
     } 

     return geofences; 
    } 
    } 
} 

上面的代碼的問題,你可能已經注意到了,我想在Unit的構造函數中調用靜態方法fill()。這會產生警告「應該以靜態方式訪問類型爲Unit.GeofenceUnit的靜態方法fill()」。我完全同意這個警告。我不想通過靜態方式訪問它。但是,如果我從GeofenceUnit類定義和它的fill()方法簽名中刪除靜態修飾符,那麼它從邏輯上講並不合理。爲什麼我會在實例方法中填充很多GeofenceUnits。良好的程序實踐表明該方法應該是靜態的。

我想我只是在這裏有一個糟糕的設計。有關如何重構這個的任何建議?

+1

只是一個提示,如果你正在尋找工作代碼的建議[CodeReview SE](https://codereview.stackexchange.com/)將是一個很好的地方張貼 – awksp

+2

爲什麼你不只是把它稱爲'GeofenceUnit.fill()'? –

+0

'如果我從GeofenceUnit類定義及其fill()方法簽名中移除靜態修飾符'。確保你明白具有「靜態」嵌套類的含義。 –

回答

1

當你在構造函數中

geofences = this.geofence.fill(); 

那是說,該類單位有一個實例成員變量說稱爲geofence,這在這裏不是真的。 (它不是所示代碼示例的一部分,無論如何。)

此外,由於您要調用的方法是靜態的,因此不需要涉及任何實例(避免在對象實例上調用靜態方法的風格更好)。爲了調用你的靜態方法填充()上GeofenceUnit你應該改變行

geofences = Unit.GeofenceUnit.fill(); 

如果方法是無關的類的實例的話很有道理的方法是靜態的。但是,使用靜態方法進行數據庫調用很難看,因此很難嘲笑查詢的結果,並使業務邏輯與基礎結構代碼糾纏在一起。

當您創建一個內部類的靜態,這意味着外部類和它之間沒有連接,內部類無法訪問外部類。因此,靜態內部類可以獨立於外部類實例來實例化,但它不具有對外部類的任何實例的任何特殊訪問。我不確定這是一個靜態的內部類還是內部類是有意義的。

我不認爲通過將JDBC調用in the constructor或通過將數據庫訪問設置爲靜態方法,可以讓您的生活更輕鬆。這個方法似乎太過關注隱私,並不關心single-reponsibility principle或簡單的單元測試。

另一種方法是使域對象do not know how they are populated與單獨的數據訪問對象(也稱爲存儲庫)從數據庫檢索數據並填充域對象。

1

'這個'修飾符意味着你所指的GeofenceUnit應該被隔離,因爲它的靜態是不可能的。你應該訪問靜態方法直接usong班級爲JHON飛碟說:GeofenceUnit.fill()

相關問題