簡體   English   中英

我應該將Java中的靜態嵌套類重構為單獨的類嗎?

[英]Should I refactor static nested classes in Java into separate classes?

我繼承了包含靜態嵌套類的代碼:

public class Foo {

// Foo fields and functions
// ...
    private static class SGroup {
        private static Map<Integer, SGroup> idMap = new HashMap<Integer, SGroup>();

        public SGroup(int id, String type) {
// ...
        }
    }
}

從閱讀SO(例如Java內部類和靜態嵌套類 ),我相信這相當於兩個單獨文件中的兩個單獨的類:

 public class Foo {

    // Foo fields and functions
    // ...
}

public class SGroup {
    static Map<Integer, SGroup> idMap = new HashMap<Integer, SGroup>();

    public SGroup(int id, String type) {
// ...
    }
}

如果這是正確的,維護靜態嵌套類結構有什么好處,還是應該重構?

這取決於課程的用途。 如果它耦合到外部類,例如,就像Map.Entry一樣,只需將其保留。但是,如果使用沒有封閉類型的類是有意義的,您也可以將它提升為頂級類。

Jorn聲明是正確的,它通常表現為以下經驗法則:

嵌套類應該是私有的,意味着托管類的保持輔助邏輯,僅此而已。 如果你不能讓它們私有 - 它們可能不應該嵌套。

例外情況是,當您定義嵌套類以允許輕松訪問托管類的狀態時,在這種情況下,您應該考慮簡單地合並兩個類以增加內聚。

說“靜態嵌套類”根本不是嵌套類並不是不恰當的。 在內部類的上下文中討論靜態嵌套類是很方便的,因為它們在代碼中聲明的方式是相似的,並且因為靜態嵌套類仍然必須用封閉類作為上下文來命名。

但是,關於靜態嵌套類,請記住這一點很重要:從編譯器和JVM的角度來看,靜態嵌套類是頂級類。 事實上,編譯器在編譯時在邏輯上將它們作為頂級類實現(至少它曾經使用過;我認為它仍然存在)。

那么,為什么有人應該使用靜態嵌套類? 為什么不一直只寫頂級課程?

對我來說,靜態嵌套類提供了一種方便的機制,用於以保持項目層次結構良好和整潔的方式對密切相關的類進行邏輯分組。 例如,假設我有一個包含以下表的數據庫:客戶端,遭遇者和服務。 我可以使用單獨的頂級類對這些表進行建模,它可以正常工作,但由於這些表都在同一個數據庫中並且與相同的數據相關,因此我發現將它們建模為以下方便:

class DB {

    static class Client {
    ...
    }

    static class Encounter {
    ...
    }

    static class Service {
    ...
    }

}

要使用其中一個模型的實例:

DB.Encounter enc = new DB.Encounter();

在我看來,這使得代碼更具可讀性,因為在代碼中立即清楚地知道正在創建的對象是從我的一個數據庫模型派生的。 它還保留了在一個共同標題下鏈接的模型的類定義,我認為這有助於使項目更易於理解。

但是從JVM(以及編譯器,它們實現它們作為頂級類)的角度來看[正如它在編譯時也提供“匿名”內部類名]),這些對象是從頂級類實例化的。 使它們不依賴於任何對象的任何實例,也不能從靜態嵌套類實例化的對象訪問封閉類的任何私有成員。

我喜歡靜態內部類,因為它們提供來自封閉類的松散耦合(無法訪問封閉類的私有成員)靜態內部類也很容易提升到頂層(因為松散耦合屬性)。

在推廣它們時,有一個簡單的拇指規則:
如果另一個類(封閉的除外)需要引用\\使用內部類。

暫無
暫無

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

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