我在其中一个答案中找到了以下示例: 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);
}
}
我想知道为什么我们这样做:即获取容器的实例为什么我们创建内部类的实例?这种方法有什么用?它是哪种设计模式? 上面的方法已经在维护项目中使用了,我仍然没有得到它的使用方法吗?
答案 0 :(得分:3)
此构造的主要目的是管理data
。内部类提出对“容器”的引用只是一个不重要的实现细节。
像你这样的抽象和简略例子的问题是:你只是将“如何”从作者转移到代码的读者。但“为什么”完全失去了。
因此,您可以将Container
替换为FileSystem
,将Item
替换为File
,将data
替换为文件的更多内部状态。然后你可以看到:
File
与Filesystem
之间的实施紧密耦合 - 每个人可能会调用另一个 - 甚至是private
方法。最后一点是IMO最重要的一点:您可以为真实用户提供简洁安全的public
API,File
和Filesystem
可以使用危险的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
类。