簡體   English   中英

從內部類實例中實現外類?

[英]Instantiation of Outer Class From Inner Class Instance?

我在下面的一個答案中找到了以下示例: Java內部類和靜態嵌套類

   public class Container {
        public class Item{
            Object data;
            public Container getContainer(){
                    return Container.this;
            }
            public Item(Object data) {
                    super();
                    this.data = data;
            }

        }

        public static Item create(Object data){
            // does not compile since no instance of Container is available
            return new Item(data);
        }
        public Item createSubItem(Object data){
            // compiles, since 'this' Container is available
            return new Item(data);
        }
    }

我想知道為什么我們這樣做:即獲取容器的實例為什么我們創建內部類的實例? 這種方法有什么用? 它是哪種設計模式? 上面的方法已經在一個維護項目中使用,我仍然沒有得到什么使用它?

這種結構的主要目的是管理data 內部類分發對“容器”的引用只是一個不重要的實現細節。

像你這樣的抽象和簡略例子的問題是:你只是將“如何”從作者轉移到代碼的讀者。 但“為什么”完全失去了。

所以,你只需更換ContainerFileSystemItemFiledata與一些內部狀態到一個文件中。 然后你可以看到:

  • 文件系統可以包含一個或多個文件。
  • 文件完全在一個文件系統中。
  • 文件的生命周期不能超過文件系統的生命周期。
  • FileFilesystem之間的實現是緊密耦合的 - 每個人都可以調用另一個 - 甚至是private方法。

最后一點是IMO最重要的一點:您可以為真實用戶提供纖薄安全的public API,而FileFilesystem可以使用彼此危險的private方法。 如果是文件系統,您不希望授予其他任何人訪問這些危險方法的權限。

這些特征在某些問題上很常見 - 因此它們被使用。

我想知道為什么我們這樣做:即獲取容器的實例為什么我們創建內部類的實例?

這不是正在發生的事情。

實際上, 除非已經有一個可以調用createSubItem方法的外部類Container的實例, 否則 不能創建內部類Item的實例。 創建內部類實例不會創建外部類的新實例。 而是在現有實例的上下文中創建它...當您調用內部類構造函數時,它是“可用的”。

所討論的方法被定義為static因此它只能訪問類的靜態成員,並且由於Item類未被聲明為靜態內部類,因此無法從靜態函數訪問它。

我不確定這個特定的設計模式或為什么它是必需的,但這可以工作:

public static Item create(Object data) {
    Container c = new Container();
    return c.new Item(data);
}

我們使用這種設計的地方之一就是擁有額外的Comparator類。

暫無
暫無

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

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