Menu
CoddyTech

常量构造函数

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 13 课,共 110 课。

常量构造函数会创建编译时常量对象。使用 const 构造函数创建值相同的对象时,Dart 会在内存中重复使用同一个实例,从而提升性能。

要创建常量构造函数,请在构造函数名称前添加 const 关键字,并确保所有实例变量都是 final:

class Color {
  final int red;
  final int green;
  final int blue;

  const Color(this.red, this.green, this.blue);
}

const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);

print(identical(white, alsoWhite)); // true

white 和 alsoWhite 指向内存中的同一个对象,因为它们使用常量构造函数创建时的值完全相同。

你也可以在不使用 const 关键字的情况下使用 const 构造函数,这样会创建普通(非常量)实例:

var red = Color(255, 0, 0);       // 普通实例
const blue = Color(0, 0, 255);    // 常量实例

常量构造函数常用于不可变的配置对象、颜色或尺寸等预定义值,以及任何你想在优化内存使用的同时确保对象不可变的场景。

challenge icon

挑战

简单

我们来为一个简单的游戏构建一个配置系统,使用常量构造函数来定义不可变且可重复使用的设置。

你将创建两个文件来组织代码:

  • difficulty.dart:定义一个表示游戏难度设置的 Difficulty 类。这个类应包含:
    • 三个 final 字段:name(String)、enemyCount(int)和 playerLives(int)
    • 一个用于初始化这三个字段的常量构造函数
    • 一个用于输出难度信息的 display() 方法
  • main.dart:导入难度类,并创建三个常量难度预设:
    • easy,名称为 'Easy',有 5 个敌人和 5 条生命
    • medium,名称为 'Medium',有 10 个敌人和 3 条生命
    • hard,名称为 'Hard',有 20 个敌人和 1 条生命
    使用 const 关键字将这三个预设都创建为编译时常量。然后按上述顺序分别调用它们的 display()。最后,使用 identical() 检查两个 const Difficulty('Easy', 5, 5) 对象是否相同,并输出结果。

display() 方法应按以下确切格式输出:

[name]: [enemyCount] enemies, [playerLives] lives

预期输出:

Easy: 5 enemies, 5 lives
Medium: 10 enemies, 3 lives
Hard: 20 enemies, 1 lives
true

亲手试试

import 'difficulty.dart';

void main() {
  // TODO: 使用 const 关键字创建三个常量难度预设:
  // easy:名称为 'Easy',5 enemies, 5 lives
  // medium:名称为 'Medium',10 enemies, 3 lives
  // hard:名称为 'Hard',20 个敌人,1 条命
  
  // TODO: 按 easy、medium、hard 的顺序,对每个难度调用 display()
  
  // TODO: 检查两个 const Difficulty('Easy', 5, 5) 对象是否相同
  // 使用 identical() 并打印结果
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Dart 在线编译器