Menu
CoddyTech

late 变量

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

late 关键字告诉 Dart,一个不可为空的变量会在使用前初始化,尽管它不会立即被赋值。如果你无法在声明或构造函数中初始化字段,但确定在访问它之前它会有值,那么这就很有用。

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
  
  void greet() {
    print('Hello, $username!');
  }
}

User user = User();
user.initialize('Alice');
user.greet();  // 你好,Alice!

如果没有 late,Dart 就会报错,因为 username 尚未初始化。late 修饰符表示你承诺会在读取它之前为它赋值。

late 的另一个好处是延迟初始化。带有初始化器的 late 变量只有在首次访问时才会计算其值:

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();
print('Config created');
print(config.settings);  // 这里会先输出 "Loading...",然后输出 "default"

只有在首次访问 settings 时,才会运行 loadSettings() 方法,而不是在创建对象时。要注意,在初始化 late 变量之前访问它会导致运行时错误。

challenge icon

挑战

简单

我们来构建一个数据库连接管理器,用 late 变量演示延迟初始化和惰性初始化。

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

  • database.dart:定义一个模拟数据库连接的 Database 类。这个类应包含:
    • 一个 late String connectionString,在对象创建后设置
    • 一个带有惰性初始化器的 late String status,它会打印 Checking connection... 并返回 'Connected'
    • 一个 connect(String connStr) 方法,用于设置 connectionString 并打印 Connection configured: [connectionString]
    • 一个 query(String sql) 方法,用于打印 Executing on [connectionString]: [sql]
    • 一个 checkStatus() 方法,用于打印 Status: [status](首次调用时会触发惰性初始化)
  • main.dart:导入数据库类,并演示 late 的两种用法:
    • 创建一个 Database 实例
    • 打印 Database object created
    • 使用连接字符串 'localhost:5432/mydb' 调用 connect()
    • 使用 'SELECT * FROM users' 调用 query()
    • 调用 checkStatus() 以触发惰性初始化

注意,connectionString 是在对象创建后手动设置的,而 status 只有在首次访问时才会计算它的值。

预期输出:

Database object created
Connection configured: localhost:5432/mydb
Executing on localhost:5432/mydb: SELECT * FROM users
Checking connection...
Status: Connected

亲手试试

import 'database.dart';

void main() {
  // TODO: 创建一个 Database 实例
  
  // TODO: 打印 'Database object created'
  
  // TODO: 用 'localhost:5432/mydb' 调用 connect()
  
  // TODO: 用 'SELECT * FROM users' 调用 query()
  
  // TODO: 调用 checkStatus() 以触发延迟初始化
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Dart 在线编译器