- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
1. 工厂构造&单例对象&初始化列表
在Dart中创建单例,这样的话就是在方法里面调用自己,肯定是不行的。
class FactoryClass {
//需要一个单例对象
static FactoryClass? _instance;
FactoryClass(){
_instance ??= FactoryClass();
}
}
复制代码
这时候就要用到命名构造函数。
class FactoryClass {
//需要一个单例对象
static FactoryClass? _instance;
FactoryClass(){
_instance ??= FactoryClass._init();
}
FactoryClass._init();
}
复制代码
在dart中的构造函数是没有返回对象的,如果需要返回对象,则需要在方法前面加factory。这里因为_instance
的nullability
所以需要强制解包
。
class FactoryClass {
//需要一个单例对象
static FactoryClass? _instance;
factory FactoryClass(){
_instance ??= FactoryClass._init();
return _instance!;
}
FactoryClass._init();
}
复制代码
工厂方法还可以优化一下
factory FactoryClass(){
return _instance ??= FactoryClass._init();
}
// 甚至
factory FactoryClass() => _instance ??= FactoryClass._init();
复制代码
这样就成功创建了一个单例。 在Dart中,还有一个叫初始化列表的东西。初始化列表会在构造函数运行之前对属性进行赋值(需要注意的是,初始化变量的右侧不能访问this
)。
初始化列表作用
- 给final 变量赋值
- 校验传递的值
class Person {
String name;
int age;
final height;
Person(this.name,this.age,int h):
height = h, assert(h>=0){
print('name: $name, age:$age,height:$height');
}
}
复制代码
当传入的height小于0的时候就会报错。
2.类方法&对象操作符
在Dart中,静态属性和静态方法(也就是类方法)使用static修饰。
class StaticClass {
//静态属性
static int count = 1;
// 静态方法
static int sum (int a ){
return a + count;
}
}
复制代码
属性赋值和方法的调用需要用类而不是对象。
StaticClass.count = 10;
StaticClass.sum(20);
复制代码
要注意的是类方法里面是无法访问非静态属性的,但是实例方法里面是可以访问静态属性的。这是因为静态方法是通过类对象来调用的,在类对象调用之前,实例对象有可能是不存在的,那么实例属性和方法就不存在所以无法访问。但是实例方法通过实例对象访问,实例对象创造出来之后类对象是一定加载进去了的,所以就可以访问静态属性和方法。 常量属性必须用static修饰否则会报错。
static const int age = 10;
复制代码
在使用对象的时候,有可能出现对象为空的情况,这时候如果调用方法,那么就会报错。
var s1;
s1= StaticClass();
s1 = null;
s1.sum2();
复制代码
为了安全起见,可以在对象后面加上?
后调用方法,也就是:
s1?.sum2()
复制代码
这个时候如果对象为空,那么就会得到null。
这个时候s1的类型就会变为Object,调用StaticClass 类中的方法就会报错。
这时候需要进行类型强转。
或者进行类型判断。
void staticDemo() {
var s1 = Object();
s1= StaticClass();
if (s1 is StaticClass) {
s1.total();
}
}
复制代码