Почему только статические поля могут быть объявлены как const?
Я только что обновил свой Dart Editor (0.5.16_r23799), и код, который был свободен от ошибок и предупреждений, больше не существует.
class Fubar {
const BAR = 1000000;
Fubar(){
}
}
Линии, начинающиеся с const
есть маркер и это сообщение:
Только статические поля могут быть объявлены как const
Я прочитал этот ch02-final-const, там ничего нет.
Этот пост dart-const-static-fields говорит, что const modifier implies static
, если мы не можем использовать const
без static
мы должны использовать final
вместо этого?... но какой документ / пост я пропустил? Намерены сделать это:
Fubar f = new Fubar();
some = f.BAR;
3 ответа
Это недавнее изменение, относящееся к примечаниям, представленным 4 июня на собрании разработчиков языка Dart:
переменные экземпляра const
Гилад считает, что они должны работать как статика, за исключением определения объема. Очевидно, что это усложняет реализацию метаданных экземпляра на виртуальной машине. Три решения:
- Нет константных полей.
- Метаданные статически ограничены.
- Попробуйте сделать это правильно.
Ларс любит 1. Я говорю 1 упрощает вещи для пользователей. Прямо сейчас, люди путаются со статической финальной константой и т. Д. Гилад в порядке с 1.
Я спросил, будет ли синтаксис статическим константным или просто константным? Пользователи путаются, когда им приходится делать "статические" с константами.
Ларс говорит, что они сбиты с толку, потому что они не понимают систему. Требование "статики" поможет им понять, что происходит.
Причина, по которой вы не можете использоватьconst
с полями класса, потому что постоянное поле создается во время компиляции, поле принадлежит экземпляру класса (пока вы явно не добавили ключевое слово static) и создается во время выполнения. Вы не можете создать поле до экземпляра, которому оно принадлежит. И поэтому поле нельзя сделать постоянным. Хотя статическое поле можно сделать постоянным, поскольку статические поля связаны с классом и с классами; во время компиляции компилятор Dart анализирует определения классов и генерирует соответствующие метаданные и инструкции. Это означает, что статическое поле (как часть определений классов) может быть постоянным (неизменяемым) во время компиляции. Таким образом, во время выполнения уже известно, что это конкретное поле класса является константой.