Dart构造函数的简写方式说明

在 Dart 中,构造函数可以使用简写方式,使代码更加简洁易读。下面是几种常见的构造函数简写方式:


1. 普通构造函数的简写

通常,我们需要手动给类的字段赋值,但可以用 this. 关键字简写。

🔹 传统方式

class Person {
  String name;
  int age;

  // 传统写法:在构造函数中手动赋值
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

✅ 简写方式

class Person {
  String name;
  int age;

  // 直接在参数列表中使用 this 关键字,省去手动赋值
  Person(this.name, this.age);
}

📌 作用:

  • this.name 直接赋值给类的字段 name,不需要在构造体内写 this.name = name

2. 可选参数的简写

🔹 传统写法

class Person {
  String name;
  int age;

  Person(String name, [int age = 18]) {
    this.name = name;
    this.age = age;
  }
}

✅ 简写方式

class Person {
  String name;
  int age;

  // 使用 [] 使 age 变成可选参数
  Person(this.name, [this.age = 18]);
}

📌 作用:

  • age 变成可选参数,默认值 18
  • 省去 this.age = age; 的赋值操作。

3. 命名参数的简写

🔹 传统写法

class Person {
  String name;
  int age;

  Person({String name = "Unknown", int age = 18}) {
    this.name = name;
    this.age = age;
  }
}

✅ 简写方式

class Person {
  String name;
  int age;

  // 直接在参数列表中使用 this
  Person({this.name = "Unknown", this.age = 18});
}

📌 作用:

  • nameage 变成命名参数,可以在调用时指定参数名。
  • 省去 this.name = name; 的赋值操作。

📌 调用方式

void main() {
  var p1 = Person(); 
  var p2 = Person(name: "Alice");
  var p3 = Person(age: 25);
  var p4 = Person(name: "Bob", age: 30);
}

4. required 关键字的简写

适用于:强制要求某些参数必须传递

🔹 传统写法

class Person {
  String name;
  int age;

  Person({required String name, required int age}) {
    this.name = name;
    this.age = age;
  }
}

✅ 简写方式

class Person {
  String name;
  int age;

  // 直接在构造函数参数中使用 this 和 required
  Person({required this.name, required this.age});
}

📌 作用:

  • required 确保 nameage 必须传递,否则编译报错。
  • 省去 this.name = name; 赋值操作

📌 调用方式

void main() {
  var p = Person(name: "Alice", age: 25); // ✅ 正常
  // var p2 = Person(name: "Bob"); // ❌ 报错,age 必填
}

5. const 构造函数的简写

适用于:不可变对象

🔹 传统写法

class Person {
  final String name;
  final int age;

  const Person({required String name, required int age})
      : name = name,
        age = age;
}

✅ 简写方式

class Person {
  final String name;
  final int age;

  const Person({required this.name, required this.age});
}

📌 作用:

  • const 让类的对象变成编译时常量,提高性能。
  • 只能用于 final 成员变量。
  • 省去 : name = name, age = age; 的初始化代码。

📌 调用方式

void main() {
  const p1 = Person(name: "Alice", age: 25);
  const p2 = Person(name: "Alice", age: 25);

  print(identical(p1, p2)); // true,两者指向同一个对象
}

6. 工厂构造函数的简写

适用于:

  • 返回缓存对象(单例模式)
  • 自定义实例化逻辑

🔹 传统写法

class Singleton {
  static final Singleton _instance = Singleton._internal();

  Singleton._internal(); // 私有构造函数

  factory Singleton() {
    return _instance;
  }
}

✅ 简写方式

class Singleton {
  static final Singleton _instance = Singleton._();

  Singleton._(); // 私有构造函数

  factory Singleton() => _instance;
}

📌 作用:

  • factory 让构造函数可以返回已有实例(比如缓存数据)。
  • 省去 return _instance; 代码,提高可读性。

📌 调用方式

void main() {
  var s1 = Singleton();
  var s2 = Singleton();

  print(identical(s1, s2)); // true,两个实例是相同的
}

7. late 变量的简写

适用于:

  • 稍后赋值的变量
  • 避免 null 检查

🔹 传统写法

class Person {
  late String name;
  int age;

  Person({required String name, this.age = 18}) {
    this.name = name; // 必须在构造方法中赋值
  }
}

✅ 简写方式

class Person {
  late String name;
  int age;

  Person({required this.name, this.age = 18});
}

📌 作用:

  • late 变量在构造函数中直接赋值,避免手动赋值代码。

总结

简写方式 作用
this. 赋值 省去手动赋值
[] 位置可选参数 让参数可选,并提供默认值
{} 命名参数 让参数更具可读性
required 关键字 强制要求必须传递参数
const 构造函数 让对象成为编译时常量
factory 构造函数 允许返回缓存对象或自定义实例化逻辑
late 变量 允许稍后赋值,避免 null 检查

这样,你可以根据不同场景选择最适合的构造函数简写方式,使代码更加清晰和易读! 🚀

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容