https://stackoverflow.com/a/55990137/462608
評論:
“初始化后無法更改”是模棱兩可的。final 變數不能被重新分配,但物件可以被改變。——jamesdlin 2 月 19 日 17:43
和https://stackoverflow.com/a/50431087/462608
最終變數的值不能更改。final 修改變數
這兩種說法是什么意思?請舉例。
uj5u.com熱心網友回復:
考慮以下類:
class SampleObject {
int id;
String value;
SampleObject(this.id, this.value);
}
最終變數無法重新分配:
void main() {
final obj1 = SampleObject(1, "value1");
// the following line will gives error:
// The final variable 'obj1' can only be set once
obj1 = SampleObject(1, "value2");
}
但物件屬性可以更改(可變):
void main() {
final obj1 = SampleObject(1, "value1");
obj1.value = "value2";
print(obj1.value);
}
但是,如果將類中的所有屬性設定為 final,它就會變成一個不可變物件:
class SampleObject {
final int id;
final String value;
SampleObject(this.id, this.value);
}
當您嘗試為其屬性重新分配值時,它會給出錯誤:
void main() {
final obj1 = SampleObject(1, "value1");
// the following line will gives error:
// 'value' can't be used as a setter because it's final.
// Try finding a different setter, or making 'value' non-final
obj1.value = "value2";
}
uj5u.com熱心網友回復:
想象一下下面的例子:
void main() {
final student = Student('Salih', 29);
print('Student before $student');
student.age = 30;
print('Student after $student');
}
class Student {
Student(this.name, this.age);
final String name;
int age;
@override
String toString() => 'Age is $age and name is $name';
}
Student 物件的欄位之一是可變的。這樣我們就可以重新分配它。上面其他人的意思是,final將首先分配變數的物件參考,但可以更改物件的內部結構。
在我們的示例中,final將阻止將某些內容重新分配給學生物件,但不會阻止我們重新分配物件中的值。
你可以在上面的 dartpad.dev 上運行代碼,看到結果如下:
Student before Age is 29 and name is Salih
Student after Age is 30 and name is Salih
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439611.html
