web-dev-qa-db-ja.com

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

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

32
w.brian

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

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

36
Lars Tackmann