#dart #design-patterns #getter #final
#dart #шаблоны проектирования #средство получения #Финал
Вопрос:
У меня есть простой вопрос.
Рассмотрим два примера кода,
// 1
class A {
final a = 23;
}
// 2
class A {
get a => 23;
}
в [2] конечное поле преобразуется в средство получения.
вопрос: При каких обстоятельствах следует использовать коды любого типа? Какой из способов является предпочтительным для dart?
Комментарии:
1. AFAIK, реальной разницы нет, это касается личных предпочтений, но вы можете прочитать эффективный dart здесь и здесь по этой теме; и я считаю, что в этом случае пример 1, который он предложил использовать
Ответ №1:
В примере 2 значение для a
может меняться со временем.
Если вы хотите управлять значением, но разрешить доступ другим классам, вы будете использовать закрытую переменную с общедоступным средством получения.
Если значение никогда не изменится, вы можете рассмотреть const / final / static
Комментарии:
1. Переменная ‘a’ должна быть ‘окончательной’. Тогда в чем разница с примером 2? Значение средства получения всегда равно 23, так как же оно может меняться со временем?
2. Это законно
Example 2
решатьa = 1000
. Затем средство получения всегда будет возвращать 1000 с этой точки, пока переменная не будет изменена снова. Когда вы помечаете переменную как final, компилятор не позволит вам переназначить значение где-либо еще, потому что он знает, что оно должно бытьfinal
. Я обновлю свой ответ некоторым кодом, чтобы сделать его более понятным3. @loganrussell48 неверен. В примере 2 нет ‘переменной a’. Это средство получения, которое всегда возвращает 23, поэтому его нельзя изменить.
4. Я думаю, мне следовало быть более ясным и явным, используя те же термины, что и документация Dart: dart.dev/guides/language/language-tour#getters-and-setters «свойства».
a
это свойство , а не переменная , как я говорил ранее.
Ответ №2:
Я не думаю, что есть предпочтительный способ. Вы можете использовать либо. Также не обязательно какая-либо разница в том, что они означают. Умный компилятор может преобразовать один из них в другой, в зависимости от того, какой способ использования класса более эффективен.
Предполагая, что компилятор не изменяет представление.
- Конечное поле вводит слот памяти в каждом экземпляре класса, который содержит значение, а затем универсальный средство получения, считывающее этот слот.
- Средство получения вводит метод получения в классе, который ничего не делает, кроме как возвращает значение.
Что лучше, зависит от того, как используется класс. Если у вас всего несколько экземпляров, то затраты памяти на дополнительный слот памяти в каждом экземпляре незначительны.
Если компилятор умен, он может пропустить неявный средство получения для поля и прочитать слот напрямую. Если компилятор умен, он также может встроить явный средство получения.
В целом, я бы не беспокоился о том, что есть разница. Я лично склоняюсь к получателю, потому что я предпочитаю рассуждать о состоянии объекта, просматривая его поля, а конечное поле с постоянным значением на самом деле не влияет на состояние.
Ответ №3:
Когда использовать final
поле:
Рассмотрим этот класс:
class Foo {
// This final field can have just one value no matter how many times it is read.
final int x = math.Random().nextInt(10);
// This getter will return different value each time it is read.
int get y => math.Random().nextInt(10);
}
Когда использовать средство получения:
В Flutter, если вы измените значение переменной, горячая перезагрузка не будет отражать это значение, но средство получения будет.