"static", "final", "const" 在Dart中意味著完全不同的東西:
"static" 表示成員在類本身上可用,而不是在類的實例上。 這就是它的意思,并沒有用于其他地方。 static修飾成員。
"final" 表示單一賦值:final變量或字段必須初始化。 一旦賦值,就不能改變final變量的值。 final修飾變量。
"const" 的含義在Dart中有點復(fù)雜和微妙。 const修飾值。 您可以在創(chuàng)建集合時使用它,例如const [1,2,3] ,以及構(gòu)造對象(代替new),比如const Point(2,3)。這里,const意味著對象的整個深度狀態(tài)可以在編譯時完全確定,并且對象將被凍結(jié)并完全不可變。
-
const對象有幾個有趣的屬性和限制:
- 必須根據(jù)可在編譯時計算的數(shù)據(jù)創(chuàng)建它們。 const對象無法訪問運行時需要計算的任何內(nèi)容。 1 + 2是一個合法的const表達式,但new DateTime.now()不是(合法的const表達式)。
- 它們是深層不能改變的。 如果你有包含集合的final字段,則該集合仍然可變。 如果你有一個const集合,那么它中的所有東西也必須是遞歸的const。
- 它們是規(guī)范化的。 這有點像字符串內(nèi)聯(lián):對于任何給定的const值,無論const表達式被計算多少次,都將創(chuàng)建并重用單個const對象。 也就是說:
getConst() => const [1, 2]; main() { var a = getConst(); var b = getConst(); print(a === b); // true } 我認(rèn)為Dart在保持語義和關(guān)鍵字清晰明確方面做得非常好。 (曾經(jīng)有一段時間將const用于const和final。這令人困惑。)唯一的缺點是,當(dāng)你想指出一個單一賦值的成員和類本身時,你必須使用兩個關(guān)鍵字:static final。