46

次のような例で _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);は、メソッド本体内ではなくクラス本体内のステートメントのように見えるため、少し混乱しているように見えます。実際には、メソッド本体のない内部コンストラクター定義であると私は信じています。

私の仮定は正しいですか?

4

1 に答える 1

64

_internal構造は、クラスに対してプライベートなコンストラクターに付けられることが多い名前です (名前は ._internal である必要はありません任意のClass._someName構造を使用してプライベート コンストラクターを作成できます)。

たとえば、次のコードでは、キャッシング コンストラクターを使用して、クラスの外部から新しい人物を作成することしかできません。

class Person {

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

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

一般に、Dart はすべての_constructionを、それを含むクラスまたはライブラリに対してプライベートとして扱います。たとえば、次のようにグローバル関数として定義できます。

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

これは、それを定義するライブラリ内で供給される任意のファイルから呼び出すことができます。

于 2012-06-20T03:55:46.273 に答える