Dart 中的常量构造函数

常量构造函数的特性

在 Dart 中,常量构造函数是一种特殊的构造函数,用于创建编译时常量。以下是常量构造函数的主要特性:

  1. 必须使用 const 关键字修饰
    常量构造函数必须以 const 关键字修饰。

  2. 类的成员变量必须是 final
    使用常量构造函数的类,其成员变量必须是 final

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

  4. 多个地方创建相同值的对象,只会保留一个对象
    如果传入的值相同,Dart 会确保只保留一个对象。

  5. Flutter 中的优化
    在 Flutter 中,const 修饰的组件在构建时不会被重建,因为它们是不可变的。

示例代码解析

以下代码展示了常量构造函数的用法:

class Container {
  final int width;
  final int height;

  const Container({required this.width, required this.height});
}

void main() {
  var c1 = Container(width: 100, height: 100);
  var c2 = Container(width: 100, height: 100);
  print(identical(c1, c2)); // false

  var c3 = const Container(width: 100, height: 100);
  var c4 = const Container(width: 100, height: 100);
  print(identical(c3, c4)); // true

  var c5 = const Container(width: 100, height: 110);
  var c6 = const Container(width: 120, height: 100);
  print(identical(c5, c6)); // false
}

代码说明

  1. 普通对象

    • var c1 = Container(width: 100, height: 100);var c2 = Container(width: 100, height: 100); 创建了两个不同的对象。
    • identical(c1, c2) 返回 false,因为它们是不同的对象。
  2. 常量对象

    • var c3 = const Container(width: 100, height: 100);var c4 = const Container(width: 100, height: 100); 创建了两个常量对象。
    • identical(c3, c4) 返回 true,因为常量对象在内存中共享存储空间。
  3. 不同值的常量对象

    • var c5 = const Container(width: 100, height: 110);var c6 = const Container(width: 120, height: 100); 创建了两个不同值的常量对象。
    • identical(c5, c6) 返回 false,因为它们的值不同。

输出结果

运行上述代码,输出结果为:

false
true
false

注意事项

  1. 常量构造函数的成员变量必须是 final
    使用常量构造函数的类,其成员变量必须是 final

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

  3. 多个地方创建相同值的对象,只会保留一个对象
    如果传入的值相同,Dart 会确保只保留一个对象。

  4. Flutter 中的优化
    在 Flutter 中,const 修饰的组件在构建时不会被重建,因为它们是不可变的。

总结

通过使用常量构造函数,可以创建编译时常量对象。在 Dart 中,常量对象在内存中共享存储空间,而普通对象则在内存中独立存储。合理使用 const 关键字可以减少内存占用,提高代码效率。希望本教程对您有所帮助!

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐