Jawaban:
Ada posting di situs web dart dan itu menjelaskan dengan cukup baik.
Terakhir:
"final" berarti penugasan tunggal: variabel terakhir atau bidang harus memiliki penginisialisasi. Setelah diberi nilai, nilai variabel final tidak dapat diubah. final memodifikasi variabel .
Const:
"const" memiliki arti yang sedikit lebih kompleks dan halus di Dart. const memodifikasi nilai . Anda dapat menggunakannya saat membuat koleksi, seperti const [1, 2, 3], dan ketika membangun objek (bukan yang baru) seperti const Point (2, 3). Di sini, const berarti bahwa seluruh keadaan dalam objek dapat ditentukan sepenuhnya pada waktu kompilasi dan bahwa objek akan dibekukan dan sepenuhnya tidak dapat diubah.
Objek Const memiliki beberapa sifat dan batasan menarik:
Mereka harus dibuat dari data yang dapat dihitung pada waktu kompilasi. Objek const tidak memiliki akses ke apa pun yang Anda perlu hitung pada saat runtime. 1 + 2 adalah ekspresi const yang valid, tetapi DateTime.now () baru tidak.
Mereka sangat, secara abadi berubah. Jika Anda memiliki bidang terakhir yang berisi koleksi, koleksi itu masih bisa berubah. Jika Anda memiliki koleksi const, semua yang ada di dalamnya juga harus const, secara rekursif.
Mereka dikanonikalisasi . Ini adalah semacam string magang: untuk nilai const yang diberikan, objek const tunggal akan dibuat dan digunakan kembali tidak peduli berapa kali ekspresi const dievaluasi.
Const:
Jika nilai yang Anda miliki dihitung pada saat runtime ( new DateTime.now()
, misalnya), Anda tidak dapat menggunakan const untuk itu. Namun, jika nilainya diketahui pada waktu kompilasi ( const a = 1;
), maka Anda harus menggunakan const
lebih dari itu final
. Ada 2 perbedaan besar lainnya antara const
dan final
. Pertama, jika Anda menggunakan const
, Anda harus mendeklarasikannya sebagai static const
bukan hanya const
. Kedua, jika Anda memiliki const
koleksi, semua yang ada di dalamnya ada di const
. Jika Anda memiliki final
koleksi, semua yang ada di dalamnya tidak final
.
Final:
final
harus digunakan lebih dari const
jika Anda tidak tahu nilai pada waktu kompilasi, dan itu akan dihitung / diraih saat runtime. Jika Anda menginginkan respons HTTP yang tidak dapat diubah, jika Anda ingin mendapatkan sesuatu dari database, atau jika Anda ingin membaca dari file lokal, gunakan final
. Apa pun yang tidak diketahui pada waktu kompilasi harus final
berakhir const
.
Dengan semua yang dikatakan, keduanya const
dan final
tidak dapat dipindahkan, tetapi bidang dalam final
objek, selama mereka tidak const
atau final
, dapat dipindahkan kembali (tidak seperti const
).
const
dan kapan final
? Apakah Anda tahu semacam kasus penggunaan untuk pengubah ini?
Nilai harus diketahui pada waktu kompilasi ,
const birthday = "2008/12/26"
Tidak dapat diubah setelah diinisialisasi.
Nilai harus diketahui saat run-time ,
final birthday = getBirthDateFromDB()
Tidak dapat diubah setelah diinisialisasi.
Jawaban @Meyi dan @ faisal-naseer terkonsolidasi dan Dibandingkan dengan sedikit pemrograman.
Kata kunci const digunakan untuk membuat variabel untuk menyimpan nilai konstanta waktu kompilasi . Kompilasi nilai konstanta waktu adalah nilai yang akan konstan saat mengkompilasi :-)
Sebagai contoh 5
adalah konstanta waktu kompilasi. Sedangkan DateTime.now()
waktu kompilasi yang tidak konstan. Karena metode ini akan mengembalikan waktu ketika garis dieksekusi pada saat runtime. Jadi kita tidak bisa menetapkan DateTime.now()
ke const
variabel.
const a = 5;
// Uncommenting below statement will cause compile time error.
// Because we can't able to assign a runtime value to a const variable
// const b = DateTime.now();
Harus diinisialisasi pada baris yang sama .
const a = 5;
// Uncommenting below 2 statement will cause compilation error.
// Because const variable must be initialized at the same line.
// const b;
// b = 6;
Semua pernyataan yang disebutkan di bawah ini dapat diterima.
// Without type or var
const a = 5;
// With a type
const int b = 5;
// With var
const var c = 6;
Variabel tingkat kelas harus diinisialisasi seperti di bawah ini.
Class A {
static const a = 5;
}
Variabel tingkat instans tidak dimungkinkan .
Class A {
// Uncommenting below statement will give compilation error.
// Because const is not possible to be used with instance level
// variable.
// const a = 5;
}
Penggunaan utama lain dari const
digunakan untuk membuat objek tidak berubah . Untuk membuat objek kelas tidak dapat diubah, kita perlu menggunakan kata kunci const dengan konstruktor dan menjadikan semua bidang sebagai final seperti yang disebutkan di bawah ini.
Class A {
final a, b;
const A(this.a, this.b);
}
void main () {
// There is no way to change a field of object once it's
// initialized.
const immutableObja = const A(5, 6);
// Uncommenting below statement will give compilation error.
// Because you are trying to reinitialize a const variable
// with other value
// immutableObja = const A(7, 9);
// But the below one is not the same. Because we are mentioning objA
// is a variable of a class A. Not const. So we can able to assign
// another object of class A to objA.
A objA = const A(8, 9);
// Below statement is acceptable.
objA = const A(10, 11);
}
kita dapat menggunakan kata kunci const ke daftar .
const a = const [] - Variabel yang a
diinisialisasi const
yang berisi daftar const
objek (yaitu, Daftar harus hanya berisi konstanta waktu kompilasi dan objek yang tidak dapat diubah). Jadi kami tidak dapat menetapkan a
dengan daftar lain .
var a = const [] - Variabel yang a
diinisialisasi sebagai var
yang berisi daftar const
objek . Jadi kita bisa dapat menetapkan daftar lain ke variabela
.
Class A {
final a, b;
const A(this.a, this.b);
}
class B {
B(){ // Doing something }
}
void main() {
const constantListOfInt = const [5, 6, 7,
// Uncommenting below statement give compilation error.
// Because we are trying to add a runtime value
// to a constant list
// DateTime.now().millisecondsSinceEpoch
];
const constantListOfConstantObjA = const [
A(5, 6),
A(55, 88),
A(100, 9),
];
// Uncommenting below 2 statements will give compilation error.
// Because we are trying to reinitialize with a new list.
// constantListOfInt = [8, 9, 10];
// constantListOfConstantObjA = const[A(55, 77)];
// But the following lines are little different. Because we are just
// trying to assign a list of constant values to a variable. Which
// is acceptable
var variableWithConstantList = const [5, 6, 7];
variableWithConstantList = const [10, 11, 15];
var variableOfConstantListOfObjA = const [A(5, 8), A(7, 9), A(10, 4)];
variableWithConstantList = const [A(9, 10)];
}
kata kunci akhir juga digunakan untuk membuat variabel untuk menyimpan nilai konstan . Setelah diinisialisasi, kami tidak dapat mengubah nilai.
final a = 5;
// Uncommenting below statement will give compilation error.
// Because a is declared as final.
// a = 6;
Semua pernyataan yang disebutkan di bawah ini dapat diterima.
// Without type or var
final a = 5;
// With a type
final int b = 5;
// With var
final var c = 6;
Dapat dapat menetapkan nilai runtime .
// DateTime.now() will return the time when the line is getting
// executed. Which is a runtime value.
final a = DateTime.now();
var b = 5;
final c = b;
Variabel akhir tingkat kelas harus diinisialisasi dalam baris yang sama.
Class A {
static final a = 5;
static final b = DateTime.now();
}
Variabel akhir level instance harus diinisialisasi dalam baris yang sama atau inisialisasi konstruktor. Nilai akan dimasukkan ke dalam memori saat objek dibuat.
Class A {
final a = 5;
}
// Constructor with a parameter.
Class B {
final b;
B(this.b);
}
// Constructor with multiple parameter.
Class C {
final c;
C(this.c, int d) {
// Do something with d
}
}
void main() {
A objA = new A();
B objB = new B(5);
C objC = new C(5, 6);
}
Menetapkan daftar .
final a = [5, 6, 7, 5.6, A()];
// Uncommenting Below statement will give compilation error.
// Because we are trying to reinitialize the object with another list.
// a = [9.9, 10, B()];
Memperluas jawaban dengan @Meyi
biggestNumberOndice
hanya maka nilai akan diinisialisasi dan memori akan ditetapkan).Konst bersifat internal final tetapi perbedaan utamanya adalah konstanta waktu kompilasi yang diinisialisasi selama kompilasi bahkan jika Anda tidak menggunakan nilainya, konstitusi akan diinisialisasi dan akan memakan ruang dalam memori.
Variabel dari kelas dapat bersifat final tetapi tidak konstan dan jika Anda menginginkan konstanta di tingkat kelas, buatlah konstanta statis.
Kode:
void main() {
// final demonstration
final biggestNumberOndice = '6';
// biggestNumberOndice = '8'; // Throws an error for reinitialization
// const
const smallestNumberOnDice = 1;
}
class TestClass {
final biggestNumberOndice = '6';
//const smallestNumberOnDice = 1; //Throws an error
//Error . only static fields can be declared as constants.
static const smallestNumberOnDice = 1;
}
Keduanya final
dan const
mencegah agar variabel tidak dipindahkan (mirip dengan cara final
kerja di Jawa atau cara const
kerja di JavaScript).
Perbedaannya berkaitan dengan bagaimana memori dialokasikan. Memori dialokasikan untuk final
variabel saat runtime, dan untuk const
variabel saat kompilasi. The final
pengubah harus menjadi lebih umum digunakan, karena banyak variabel program tidak perlu memori apapun sejak logika program tidak akan meminta mereka untuk diinisialisasi. Denganconst
variabel, Anda pada dasarnya memberi tahu komputer, "Hei, saya perlu memori untuk variabel ini di muka karena saya tahu saya akan membutuhkannya."
Memikirkan mereka dengan cara ini memudahkan untuk memahami perbedaan dalam penggunaan sintaksis mereka. Terutama bahwa suatu final
variabel dapat berupa variabel instan, tetapi const
harus merupakan static
variabel pada suatu kelas. Ini karena variabel instan dibuat saat runtime, dan const
variabel - menurut definisi - tidak. Dengan demikian, const
variabel pada suatu kelas haruslah static
, yang berarti secara sederhana bahwa satu salinan dari variabel itu ada pada suatu kelas, terlepas dari apakah kelas tersebut dipakai.
Video ini memecahnya cukup sederhana: https://www.youtube.com/watch?v=9ZZL3iyf4Vk
Artikel ini membahas lebih dalam dan menjelaskan perbedaan semantik yang sangat penting antara keduanya, yaitu final
memodifikasi variabel dan const
memodifikasi nilai, yang pada dasarnya bermuara pada hanya mampu menginisialisasi const
nilai yang dapat diturunkan pada saat kompilasi.
https://news.dartlang.org/2012/06/const-static-final-oh-my.html
Jika Anda datang dari C++
kemudian const
di Dart
adalah constexpr
di C++
dan final
di Dart
adalah const
di C++
.
Di atas hanya berlaku untuk tipe primitif. Namun dalam Dart
objek yang ditandai final
dapat berubah dalam hal anggota itu.
const
di C ++ hampir selalu digunakan untuk menentukan bahwa suatu objek tidak bisa berubah melalui referensi atau pointer tertentu. final
di Dart tidak mencegah objek dimutasi melalui variabel itu.
Kapan menggunakan kata kunci yang mana?
Contoh sederhana untuk keduanya: Gunakan final: Jika Anda tidak tahu apa nilainya pada saat kompilasi. Misalnya, saat Anda perlu mendapatkan data dari API, ini terjadi saat menjalankan kode Anda.
Gunakan const: Jika Anda yakin suatu nilai tidak akan berubah ketika menjalankan kode Anda. Misalnya, ketika Anda mendeklarasikan kalimat yang selalu tetap sama.
https://itnext.io/difference-between-const-and-final-in-dart-78c129d0c573
const
: stackoverflow.com/questions/51576209/… dan explonation sederhana kefinal
konstan (tidak dapat menetapkan ulang atau menetapkan sekali dibuat dengan kata kunci akhir) dan Anda harus menginisialisasi sekali.