[英]Is it possible to determine the classname of an outer class from an instance of an anonymous inner class
[英]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
。 內部類分發對“容器”的引用只是一個不重要的實現細節。
像你這樣的抽象和簡略例子的問題是:你只是將“如何”從作者轉移到代碼的讀者。 但“為什么”完全失去了。
所以,你只需更換Container
與FileSystem
和Item
與File
和data
與一些內部狀態到一個文件中。 然后你可以看到:
File
和Filesystem
之間的實現是緊密耦合的 - 每個人都可以調用另一個 - 甚至是private
方法。 最后一點是IMO最重要的一點:您可以為真實用戶提供纖薄安全的public
API,而File
和Filesystem
可以使用彼此危險的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.