1

我在答案之一中找到了以下示例: 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);
        }
    }

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

4

3 回答 3

3

该结构的主要目的是管理data. 内部类分发对“容器”的引用只是一个不重要的实现细节。

像您这样的抽象和删节示例的问题是:您只需将“如何”从编写者转移给代码的读者。但是“为什么”完全丢失了。

所以你可以ContainerFileSystemItem和替换文件Filedata更多内部状态。然后你可以看到:

  • 一个文件系统可以有一个或多个文件。
  • 一个文件恰好在一个文件系统中。
  • File 的生命周期不能超过文件系统的生命周期。
  • File和之间的实现Filesystem是紧密耦合的——每个都可以调用另一个——甚至是private方法。

最后一点是 IMO 最重要的一点:您可以向public真实用户提供苗条和安全的 API,同时File可以使用彼此的Filesystem危险方法。private对于文件系统,您不想授予其他任何人访问这些危险方法的权限。

这些特征对于某些问题很常见 - 因此它们被使用。

于 2012-09-15T12:57:44.130 回答
1

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

这不是正在发生的事情。

事实上,除非您已经拥有 可以调用该方法的外部类的实例,否则您无法创建内部类的实例。创建内部类实例不会创建外部类的新实例。相反,它在现有实例的上下文中创建它......当您调用内部类构造函数时,它是“可用的”。Item ContainercreateSubItem

于 2012-09-15T12:50:37.967 回答
0

有问题的方法被定义为static只能访问类的静态成员,并且由于Item该类未声明为静态内部类,因此无法从静态函数访问。

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

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

我们使用这种设计的地方之一就是为了增加Comparator类。

于 2012-09-15T12:40:24.260 回答