Вопрос по dart – Какова семантика _internal?

19

Я продолжаю видеть ссылки на _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); кажется немного запутанным, потому что кажется, что это утверждение внутри тела класса, а не внутри тела метода, что заставляет меня поверить, что это фактически внутреннее определение конструктора без тела метода.

Верны ли мои предположения?

Ваш Ответ

1   ответ
25

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

В общем дартс лечит любой_construction как частный для класса или библиотеки, которая его содержит. Например, вы можете определить как глобальную функцию следующим образом:

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

который может быть вызван из любого файла из библиотеки, которая его определяет.

Еще раз спасибо, Ларс. Это очень помогает. Есть еще некоторые вещи, которые я не совсем понимаю, например, конструкторы могут иметь тело метода? Члены класса, определенные как final, могут быть установлены только в списке параметров конструктора, но не в теле конструктора? Вот некоторые из вещей, которые все еще смущают меня. w.brian

Похожие вопросы