工厂构造、单例对象
在实现构造函数时使用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);
}
初始化列表
初始化列表的目的:
- 给final变量赋值;
- 校验传递的值。
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
}