2012-07-05 121 views
2

我只是想有顏色的最終名單:初始化必須是編譯時常

final List<String> COLORS = ['#cefbe4', '#81ec72', '#5cd646']; 
final num MAX = 90; 
class Square { 
// ... 

它的確定爲最大,但它並沒有編譯列表: 初始化必須是編譯時常

我也試過:

static final num MAX = 90; 
class Square { 
    final List<String> COLORS = ['#cefbe4', '#81ec72', '#5cd646']; 

新的錯誤:「初始化必須是編譯時間常數」

唯一的解決辦法,我發現是在構造函數初始化... 我不喜歡這個解決方案:我不想通過Square對象列表實例。 我該怎麼辦?

回答

2

我沒有和你一樣的錯誤。在第一種情況下,我得到編譯時警告「預期的常量表達式」,第二種情況是編譯時警告和運行時錯誤。試試你可以找到最新的SDK here

static final num MAX = 90; 
class Square { 
    final List<String> COLORS = ['#cefbe4', '#81ec72', '#5cd646']; 

在這種情況下,靜態它沒有任何意義,因爲靜態表示類變量這都爲同一類的所有實例化對象相同。在這種情況下,MAX在類邊界之外。因此會顯示運行時錯誤,並顯示編譯時警告(「頂級字段不能爲靜態」)。

我想這兩個MAXCOLORS應該是爲廣場類的所有實例相同。所以這是有道理的這樣做:

class Square { 
    static final List<String> COLORS = const ['#cefbe4', '#81ec72', '#5cd646']; 
    static final num MAX = 90; 
} 
+0

的確,我正在使用上週的版本(我沒有通過此版本的過期通知)。 現在與const,它工作正常! 謝謝 – 2012-07-05 21:51:08

+0

請注意,這將在未來發生變化;實際上,它在規範中已經發生了變化。原始代碼完全符合規範,我們只是在等待實現趕上。您將能夠使用任意表達式來初始化靜態/頂級變量,這些表達式將被延遲評估。 – Ladicek 2012-07-08 08:13:39

1

該列表本身是最終的部分,而不是內容。最終列表中的內容仍然可以添加和刪除。

final List<String> COLOURS = new ArrayList<String>(); 

這將創建列表。列表的實際填充將在構造函數中完成,或者在代碼中的任何地方完成。

在我看來,使用枚舉會更合適。

+1

我其實只是注意到這不是一個Java的問題,但我確信原則仍然存在。 – 2012-07-05 20:42:20

+0

不,原理是不一樣的。 Dart要求初始化變量爲*常量表達式*,而*新的ArrayList ()*在內容可變的初始化過程中創建一個新對象。 – Alex 2012-07-05 21:33:46

+0

好吧,正如我所說,我不知道飛鏢。 – 2012-07-05 21:34:44

相關問題