Введение

В отличие от java, где все является классом, в dart вы можете объявлять как константные, так и конечные переменные внутри файла, и они не обязательно должны быть обернуты классом.

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

Переменная ! это что?

Переменная обычно указывает на то, что меняется со временем. В программировании мы называем это заполнителем, которому со временем могут быть присвоены разные значения. Далее мы также будем называть заполнители констант и final также как переменные не потому, что мы хотим, чтобы они вели себя так же, как обычные переменные, а просто ради единообразия.

Поле ! это что?

Поле - это переменная внутри класса. Это также называется свойством в других языках программирования, поскольку оно связано с этим конкретным классом, поэтому определяет некоторые из его свойств. В Dart такая переменная называется полем.

Последнее ключевое слово

final: определяет переменную, которую нельзя изменять после первого присвоения значения.

В: Но почему я предпочел бы объявить что-то окончательное, что я могу назначить только один раз, вместо того, чтобы иметь возможность назначать это несколько раз?
A: Потому что сущности, которые не меняются, называются неизменяемыми (неизменяемыми) и в состоянии - В ориентированной парадигме они практически незаменимы для управления государством.

Фактически, окончательная декларация является очень предпочтительной, и рекомендуется использовать ее везде и в максимально возможной степени.

Следующий код вызовет ошибку:

⇒ final переменные могут быть присвоены только один раз, и это происходит во время выполнения.

Ключевое слово const

const: определяет константу. то, что не следует менять со временем.

Теперь разница здесь в том, что, в отличие от final, значение, которое определено, будет установлено во время компиляции, что означает, что выражение, которое оценивает const, также будет оцениваться во время компиляции.

⇒ переменные const вычисляются во время компиляции.

⇒ Переменная, объявленная константой, также является окончательной, поскольку значение не меняется со временем, а значение известно во время выполнения.

⇒ Все константные переменные являются конечными переменными.

Пример:

Плохой пример:

Поскольку DateTime.now () оценивается во время выполнения, а не во время компиляции.

Любое выражение, которое можно вычислить во время компиляции, можно объявить как const.

Пример:

Тип можно не указывать при объявлении константы

const double pi = 3,14;

такой же как

const pi = 3,14;

Причина в том, что это константа, а необходимая память выделяется раз и навсегда, поэтому компилятор не должен беспокоиться о будущих значениях, поэтому каждый из них должен размещаться в выделенном пространстве в соответствии со своим типом.

Другой пример, показывающий, что вы можете объявить константу с любым выражением, которое может быть вычислено во время компиляции, независимо от того, насколько сложным является выражение, - это использование вложенных выражений.

Пример:

Важно то, что выражение может быть оценено во время компиляции, что делает подвыражения также способными оцениваться во время компиляции и, следовательно, также константами, но мы можем опустить ключевое слово const в этом случае, поскольку это очевидно.

Приведенный выше пример можно также объявить следующим образом:

Но это противоречит руководству по дротику, поэтому не используйте const избыточно и по возможности опускайте его.

Ключевые слова const и final внутри класса и ключевое слово static

В: теперь внутри класса я должен использовать const или final для моих полей?
A: это зависит от назначения поля

Если это поле, значение которого всегда известно во время компиляции, используйте константу, если значение должно быть присвоено только один раз и будет известно только во время выполнения, тогда используйте final.

1.const поля внутри класса:

Следующий пример выдаст ошибку, и мы увидим, почему

Во-первых, давайте проигнорируем ошибку и проанализируем логику этого кода.

теперь вы могли заметить, что numberOfWheels - это поле, которое должно быть общим для всех экземпляров Car и не зависит от какого-либо экземпляра.
Это свойство самого класса Car независимо от что, если у нас уже есть его экземпляр или нет.
Поэтому мы должны объявить его статическим. Это свойство самого класса Car.

И это причина, по которой компилятор dart жалуется на то, что поле const внутри класса не является статическим.

Итак, это правильный способ объявить наш класс без жалоб компилятора dart:

⇒ внутри класса поля const должны быть статическими

⇒ если вы используете константу только для целей вычислений внутри класса, в любом случае не объявляйте ее константой и используйте вычисление выражения напрямую.

2. поля final внутри класса:

В: А как насчет полей final внутри класса, можем ли мы объявить их статическими, если это необходимо?
A: Нет! потому что для этого не будет причин

Причина в следующем:

если вы объявляете поле окончательным, это означает, что вам нужно присвоить ему значение во время выполнения, это обычно происходит через конструктор, но статическое поле не зависит от любого экземпляра

Вы видите здесь противоречие!

Вот почему компилятор dart в любом случае не позволит вам инициализировать статическое финальное поле в конструкторе. Следующий фрагмент кода вызовет ошибку

⇒ final поля никогда не бывают статичными.

Статическое ключевое слово

Q: Хорошо! теперь мы знаем, что поля const всегда статичны, а поля final никогда не статичны, но как насчет статических полей в целом, должны ли они всегда объявляться также как const?
A: Нет! Но будь осторожен!

Пример:

Приведенный выше фрагмент кода будет скомпилирован, но если вы забудете инициализировать numberOfWheels, это может вызвать проблемы, поскольку вы должны убедиться, что инициализируете статическое поле извне класса.

нравится:

Примечание: вы не можете присвоить константному полю значение извне класса, это работает, только если поле не константное и, очевидно, тоже не final.

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

Резюме

Подведем итоги всех выводов, которые мы сделали.

0. Переменные final могут быть присвоены только один раз, и это происходит во время выполнения.
1. Переменные const оцениваются во время компиляции.
2. Объявленная переменная константа также является final, поскольку значение не изменится с течением времени, и значение всегда известно во время выполнения.
3. Все константные переменные являются конечными переменными.
4. Внутри класса константные поля должны быть статическими.
5. Если вы используете константа только для целей вычислений внутри класса, в любом случае избегайте объявления ее константой и используйте вычисление выражения напрямую.
6. final поля никогда не являются статическими.
7. статические поля внутри класса обычно являются константами, если они не тогда, попробуйте убедиться, что они вам нужны таким образом, и будьте осторожны, вы присваиваете полю значение перед его использованием, иначе оно будет нулевым.