const构造函数能否创建非const类对象?Dart代码异常现象问询
关于Dart中const构造函数与非const对象的问题解析
首先明确回答:const构造函数完全可以创建非const类对象,咱们来逐一拆解你给出的两段代码问题:
第一段代码报错的原因
你这段代码的问题并不是“const构造函数能不能创建非const对象”,而是反过来——你用const关键字去调用了一个普通构造函数:
class TestConst { final num x; final num y; TestConst(this.x, this.y); // 这是普通构造函数,没有const修饰 } void main() { TestConst myconst1 = const TestConst(1,2); // 错误点在这里 TestConst myconst2 = const TestConst(1,2); print(identical(myconst1, myconst2)); }
Dart的规则是:如果用const修饰对象创建表达式,要求必须调用const构造函数。你的TestConst类只定义了普通构造函数,所以编译器会抛出Cannot invoke a non-'const' constructor where a const expression is expected.的错误。
第二段代码的行为解释
这段代码里的构造函数是真正的const构造函数,而你调用它时没有加const关键字:
class TestConst { final num x; final num y; const TestConst(this.x, this.y); // const构造函数 } void main() { TestConst myconst1 = TestConst(1,2); TestConst myconst2 = TestConst(1,2); print(identical(myconst1, myconst2)); // 返回false }
这里的调用方式是创建非const对象——Dart允许你省略const关键字调用const构造函数,但此时每次调用都会生成一个全新的实例,不会复用常量池中的对象,所以identical(myconst1, myconst2)返回false。
如果想要让相同参数的实例复用,只需要在调用时加上const关键字即可:
void main() { TestConst myconst1 = const TestConst(1,2); TestConst myconst2 = const TestConst(1,2); print(identical(myconst1, myconst2)); // 此时返回true }
核心总结
- const构造函数有两种调用方式:
- 带
const关键字:生成编译时常量对象,相同参数的实例会被放入常量池复用,identical返回true - 不带
const关键字:生成普通非const对象,每次调用都会创建新实例,identical返回false
- 带
- 第一段代码的错误是因为用
const修饰调用了普通构造函数,和const构造函数创建非const对象的能力无关
内容的提问来源于stack exchange,提问作者NeoZoom.lua
相关产品推荐
相关产品推荐

