A final és a const is olyan változó típust hoz létre, aminek az értéke állandó. Mindkettő arra utal tehát, hogy létrehozzunk valami olyasmit, ami nem megváltoztatható, azaz konstans.
Egy megjegyzés, hogy ha például a var kulcsszóval hozunk létre változót, akkor annak értéke megváltoztatható.
var elteltPercekSzama= 10;
final
A final-t akkor használjuk, ha egy érték nem változik meg a program futásától kezdve. Futási idejű konstansok. Egy final változónak vagy adunk kezdőértéket, vagy nem.
Ha ismert a típus a létrehozáskor:
final String nev;
Ha nem ismert:
final egyValtozo;
Kezdőértékkel létrehozva pedig:
final String nev = 'Macilaci';
Tehát, amennyiben a final kulcsszóval hozunk létre egy változót:
- akkor, ha kezdőértékkel hoztuk létre, akkor amíg a program fut, nem lehet megváltoztatni az értékét
- kezdőérték nélkül létrehozva pedig amikor a futás alatt először értéket kap, az lesz a végleges értéke és ez már nem változtatható meg a futás alatt mégegyszer
A kód írásának pillanatban nem tudjuk milyen értéket fog felvenni.
Még egy jó példa, ha egy változó egy függvényhívásból kap értéket. Abban a pillanatban, amikor a változót létrehozzuk, akkor még nem ismert az értéke. Tehát futás során kap értéket azt viszont szeretnénk, ha nem változna, ezért final-nak definiáljuk:
final startAlignment = getAlignment();
const
Fordítási idejű konstansok. Létrehozáskor már ismerjük az értéket és az nem is fog változni a futás alatt sem. Tehát futási idejű állandók is egyben.
Példa:
const questions = [
{
'questionText': 'What is your favorite color?',
'answers': ['Red', 'Green', 'Blue', 'Black', 'White']
},
{
'questionText': 'What is your favorite animal?',
'answers': ['Dog', 'Cat', 'Lizard', 'Shark', 'Elephant']
},
{
'questionText': 'What is your favorite fruit?',
'answers': ['Apple', 'Pear', 'Blueberry', 'Plum', 'Appricot']
},
];
Némi bonyolításként a const kulcsszó nem csak a változó neve elé helyezhető el, hanem az érték elé is, bár ebben az esetben a VSCode jelez, hogy szükségtelen kitenni, mert a kettő ugyanazt fogja jelenteni:
const questions = const [
Ha a változó neve elé tesszük, akkor maga a változó lesz állandó. Ha az érték elé, akkor pedig az érték.
Magyarázat: a Dart-ban minden objektum a memóriában tárolódik. A létrehozott változók pedig mutatók ezekre a memória területekre.
Más a helyzet ebben az esetben:
var questions = const [
{
'questionText': 'What is your favorite color?',
'answers': ['Red', 'Green', 'Blue', 'Black', 'White']
},
Ekkor maga a változó nem állandó, csak a neki adott érték. Tehát később, ha a questions-nek új értéket adunk, azt simán lehet. Ekkor nem jön létre új memóriaterület, hanem a régi felülíródik az újjal.
Tehát a
questions = [];
hatására egy új üres lista jön létre.
Ha viszont a konstans listához akarunk új értéket adni, akkor az már nem lehetséges:
var dummy = const ['hello'];
dummy.add('Aloha');
Ez már nem lehetséges, mert a lista állandó és nem lehet hozzáadni már semmit.
A tanulság, hogy mindig legyünk egyértelműek a kódolás során, és fogalmazzuk meg, hogy mit akarunk.
Még egy példa:
import 'package:flutter/material.dart';
const startAlignment = Alignment.topLeft;
Ebben az esetben már a változó létrehozásának pillanatában ismerjük az értékét, amit nem akarunk, hogy később megváltozzon. Fordítási idejű konstans ez is.