Dart const常量构造函数详解

常量构造函数总结如下几点:

  • 常量构造函数需以const关键字修饰
  • const构造函数必须用于成员变量都是final的类
  • 构建常量实例必须使用定义的常量构造函数
  • 如果实例化时不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例

下面结合实例,对以上几点加以说明

 

正确的常量构造函数定义

根据以上的总结,定义一个Point类,包含一个常量构造函数,注意其成员变量都是final类型,且构造函数用const修饰

class Point {
  final int x;
  final int y;
  const Point(this.x, this.y);
}

常量构造函数需以const关键字修饰

如下代码定义一个const对象,但是调用的构造方法不是const修饰的,则会报The constructor being called isn't a const constructor.错误

void main() {
  const point = Point(1, 2); // 报错
}

class Point {
  final int x;
  final int y;
  Point(this.x, this.y);
}

const构造函数必须用于成员变量都是final的类

如下代码中成员变量x为非final,会报Can't define a const constructor for a class with non-final fields.错误

class Point {
  int x;
  final int y;
  const Point(this.x, this.y);
}

 

构建常量实例必须使用定义的常量构造函数

如下代码,定义一个const对象,但是调用的却是非常量构造函数,会报The constructor being called isn't a const constructor.错误

void main() {
  var point = const Point(1, 2); // 报错
  print(point.toString());
}

class Point {
  int x;
  int y;
  Point(this.x, this.y); // 非const构造函数
  
  String toString() {
    return 'Point(${x}, ${y})';
  }
}

 

如果实例化时不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例

如下代码,用常量构造函数构造一个对象,但是未用const修饰,那么该对象就不是const常量,其值可以再改变

void main() {
  var point = Point(1, 2); // 调用常量构造函数,但是未定义成常量
  print(point.toString());
  point = Point(10, 20); // 可以重新赋值,说明定义的变量为非常量
  print(point.toString());
}

class Point {
  final int x;
  final int y;
  const Point(this.x, this.y);
  
  String toString() {
    return 'Point(${x}, ${y})';
  }
}

 

 

 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

野猿新一

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值