2012-07-05 92 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

相关问题