2012-06-20 67 views
4

我一直看到引用像下面的示例來_internal:_internal的語義是什麼?

class Symbol { 
    final String name; 
    static Map<String, Symbol> _cache; 

    factory Symbol(String name) { 
     if (_cache == null) { 
     _cache = {}; 
    } 

    if (_cache.containsKey(name)) { 
     return _cache[name]; 
    } else { 
     final symbol = new Symbol._internal(name); 
     _cache[name] = symbol; 
     return symbol; 
     } 
    } 

    Symbol._internal(this.name); 
} 

我從它的私人訪問的構造函數的代碼聚集​​。最後一行Symbol._internal(this.name);似乎有點令人困惑,因爲它似乎是類體內的聲明,而不是方法體內的聲明,導致我相信它實際上是沒有方法體的內部構造函數定義。

我的假設是否正確?

回答

12

_internal建設只是一個名字經常給那些普里瓦對類構造函數(名字不被._internal你可以使用任何Class._someName建設創建一個私有構造要求) 。

例如,下面的代碼只允許使用一個緩存構造函數來創建從類以外的新人數:

class Person { 
    factory Person(String name) { 
    if(_cache === null) { 
     _cache = new Map<String,Person>(); 
    } 
    if(_cache[name] === null]) { 
     _cache[name] = new Person._internal(name); 
    } 
    return cache[name]; 
    } 

    Person._internal(this.name); 

    final String name; 
    static Map<String,Person> _cache; 
} 

一般飛鏢胎面任何_construction私人要麼類或包含它的庫。例如,您可以定義爲這樣一個全球性的功能:

_globalToThisLibaryOnly() { 
    print("can only be called globally within this #library"); 
} 

可以從被定義它的圖書館內源的任何文件被調用。

+1

再次感謝拉爾斯。這有很大幫助。還有一些我不完全理解的東西,比如,構造函數可以有一個方法體呢?定義爲final的類成員只能在構造函數的參數列表中設置,而不能在構造函數體中設置?這些仍然讓我感到困惑。 –