Comments 4
Google выбрал простоту в ущерб функциональности, с рассчетом на очень средний уровень разработчиков. Язык не соответствует современным тенденциям и концептуально не продуман. Многие вещи реализованы откровенно плохо. Другие же были копипейстнуты с Java, даже не меняя букв. Что плохо:

— функциональный тип без сигнатуры функции (только опционально через typedef)
— generics без ковариантности/контравариантности
— отсутствует защита видимости public/private
— отсутвтвует nullable/non-nullable types (+50% ошибок)
— спорная концепция constructor initializers и абсолютно лишние factory constructors
— интерфейсы вместо трейтов
— наследование без проверки на override (фу!)

Такой язык был бы популярным лет 12 назад. Ремейк «Java for Web developer».
Парсер тоже так и не поправили:

По прежнему возможно писать такой код:

main() {
    SOMETYPE one = 1;
    String two = 1;
    print('Hi ' + one + two); //Hi 12
}


Транслятор даже не ругнется если явно не выставить --enable_type_checks .

Ну и соответственно как вы понимаете это тоже прокатит:

main() {
  Map<String, String> map = {'foo': 1};

  print(map["foo"]); //1
}


А насчет инструкции for-in, то они забыли добавить метод .items():

main() {
	var map = {
	  'a': 1,
	  'b': 2
	};
	
	for (final i in map.getKeys())
	  print(i); // a, b

	for (final i in map.getValues())
	  print(i); // 1, 2
}


Иными словами если нужно получить и ключ и значение, то нужно использовать .forEach(), при этом есть определенные ограничения на использование инструкций в теле метода, которые можно обойти допустим так:

main() {
	var map = {
	  'a': 1,
	  'b': 2
	};
	
	var result = 0;
	
	void predicate(String key, int value) {
	    if (value == 1)
	       result = 1;
	    else 
	       result = 2;
	};

	map.forEach((key, value) => predicate);

	print(result); //1
}


Ну и еще пара десятков подобных казусов…


абсолютно лишние factory constructors

Если я вас правильно понял, то это реализовано:

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

main() {
  var a = new Symbol('something');
  print(a.name); //something
}



отсутствует защита видимости public/private


Чтобы член класса стал имел статус private, нужно добавить префикс _
Only those users with full accounts are able to leave comments. Log in, please.