从内部类实例中实现外类?

时间:2012-09-15 12:36:03

标签: java design-patterns inner-classes

我在其中一个答案中找到了以下示例: Java inner class and static nested class

   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);
        }
    }

我想知道为什么我们这样做:即获取容器的实例为什么我们创建内部类的实例?这种方法有什么用?它是哪种设计模式? 上面的方法已经在维护项目中使用了,我仍然没有得到它的使用方法吗?

3 个答案:

答案 0 :(得分:3)

此构造的主要目的是管理data。内部类提出对“容器”的引用只是一个不重要的实现细节。

像你这样的抽象和简略例子的问题是:你只是将“如何”从作者转移到代码的读者。但“为什么”完全失去了。

因此,您可以将Container替换为FileSystem,将Item替换为File,将data替换为文件的更多内部状态。然后你可以看到:

  • 文件系统可以包含一个或多个文件。
  • 文件正好位于一个文件系统中。
  • 文件的生命周期不能超过文件系统的生命周期。
  • FileFilesystem之间的实施紧密耦合 - 每个人可能会调用另一个 - 甚至是private方法。

最后一点是IMO最重要的一点:您可以为真实用户提供简洁安全的public API,FileFilesystem可以使用危险的private彼此的方法。如果是文件系统,您不希望授予其他任何人访问这些危险方法的权限。

这些特征在某些问题上很常见 - 因此可以使用它们。

答案 1 :(得分:1)

  

我想知道为什么我们这样做:即获取容器的实例为什么我们创建内部类的实例?

这不是正在发生的事情。

实际上,你不能创建内部类Item 的实例,除非你已经有外部类Container的实例您可以调用createSubItem方法。创建内部类实例不会创建外部类的新实例。而是在现有实例的上下文中创建它...当你调用内部类构造函数时,它是“可用的”。

答案 2 :(得分:0)

有问题的方法定义为static,因此它只能访问类的静态成员,因为Item类未被声明为静态内部类,所以无法从静态访问它功能

我不确定这个特定的设计模式或为什么需要它但这可以工作:

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

我们使用此类设计的其中一个地方就是有额外的Comparator类。