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

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