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 变量之前访问它会导致运行时错误。
挑战
简单我们来构建一个数据库连接管理器,用 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() 以触发延迟初始化
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器