identical函数
用法:
bool identical(
Object? a,
Object? b
)
作用:检查两个引用是否指向同一个对象,简单说就是检查两个实例是否共用一个存储空间
例1:
var o1= new Object();
var o2= new Object();
print(identical(o1,o2)); //false
print(identical(o1,o1)); //true
由此得知,o1,o2不共用存储空间
例2:
print(identical([2],[2]));//false
var a=[2];
var b=[2];
print(identical(a,b));//false
同样的,两个等同值的列表也是不公用存储空间的。
但是,有一个特例const:
const关键字在多个地方创建相同的对象的时候,内存中只保留了一个对象
例3:
const Object() 表示实例化常量构造函数
var o1=const Object();
var o2=const Object();
print(identical(o1,o2)); //true
print(identical(o1,o1)); //true
print(identical(const[2],const[2]));//true
const a=[2];
const b=[2];
print(identical(a,b));//true
那么可知,共享内存空间的前提条件是:
1.常量
2.值相等
常量构造函数的特点
这是我们定义的Container类:
class Container{
int width;
int height;
Container({required this.width,required this.height});
//这是一个普通的构造函数
}
void main(){
var c1=new Container(width: 100,height: 100);
var c2=new Container(width: 100,height: 100);
print(identical(c1,c2));//false
}
这是具有常量构造函数的container类:
class Container{
final int width;
final int height;
const Container({required this.width,required this.height});
}
void main(){
var c1=new Container(width: 100,height: 100);
var c2=new Container(width: 100,height: 100);
print(identical(c1,c2));//false
var c3=const Container(width: 100,height: 100);
var c4=const Container(width: 100,height: 100);
print(identical(c3,c4));//true
}
所以我们可以得知:
1.常量构造函数需以const关键字修饰
2.const构造函数必须用于成员变量都是final的类
3.如果实例化时不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例
4.实例化常量构造函数的时候,多个地方创建这个对象,如果传入的值相同,只会保留一个对象
5.Flutter中,const修饰不仅仅是节省组件构建时的内存开销,Flutter 在需要重新构建组件时,不会重新构建const组件(在重新build的时候不会构建const修饰的组件)
在特定情况下使用常量构造函数,能极大节约内存空间,并有效提升应用性能