Dart-工厂构造、单例对象、初始化列表

125 阅读1分钟

工厂构造、单例对象

在实现构造函数时使用factory关键字,该构造函数不会重复创建类的新实例。例如,工厂构造函数可以从缓存返回实例,也可以返回子类型的实例。

注意:工厂构造函数不能访问this关键字。
案例:使用工厂构造函数实现单例
class FactoryClass {

  static FactoryClass? _instance;
  // 必须加factory,否则无法使用return
  factory FactoryClass(){
    if (_instance == null) {
      _instance = FactoryClass._init();
    }
    // 强制解包(前面有空判断,所以_instance不会为null)
    return _instance!;
  }
  // 私有的命名构造函数!外部无法访问
  FactoryClass._init();
}

// 第一次优化
class FactoryClass {

  static FactoryClass? _instance;

  factory FactoryClass(){
    // if (_instance == null) {
    //   _instance = FactoryClass._init();
    // }
    _instance ??= FactoryClass._init();
    // 强制解包(前面有空判断,所以_instance不会为null)
    return _instance!;
  }
  // 私有的命名构造函数!外部无法访问
  FactoryClass._init();
}

// 第二次优化
class FactoryClass {

  static FactoryClass? _instance;

  factory FactoryClass(){
    // if (_instance == null) {
    //   _instance = FactoryClass._init();
    // }
    // _instance ??= FactoryClass._init();
    // 强制解包(前面有空判断,所以_instance不会为null)
    return _instance ??= FactoryClass._init();
  }
  // 私有的命名构造函数!外部无法访问
  FactoryClass._init();
}

// 第三次优化
class FactoryClass {

  static FactoryClass? _instance;

  factory FactoryClass() => _instance ??= FactoryClass._init();
  // {
    // if (_instance == null) {
    //   _instance = FactoryClass._init();
    // }
    // _instance ??= FactoryClass._init();
    // 强制解包(前面有空判断,所以_instance不会为null)
    // return _instance ??= FactoryClass._init();
  // }
  // 私有的命名构造函数!外部无法访问
  FactoryClass._init();
}

void main() {

    runApp(const MyApp());

    FactoryClass f1 = FactoryClass();
    FactoryClass f2 = FactoryClass();
    
    print(f1 == f2); // true
    // hashCode是相同的值
    print(f1.hashCode); 
    print(f2.hashCode);
}

初始化列表

初始化列表的目的:

  1. 给final变量赋值;
  2. 校验传递的值。
class Person {
  String name;
  int age;
  final height;

  // 初始化列表会在构造函数之前访问
  Person(this.name, this.age, int h):height = h,assert(h>=0),assert(age>=0){
    print("name=${this.name} age=${this.age} height=${this.height}");
  }
}
void main() {

  runApp(const MyApp());
  
  Person p = Person("ylm", 20, -1); // 报错
  Person p = Person("ylm", 20, 170); // name=ylm age=20 height=170
}