# 类 get set
get 和 set 是用来定义属性的 getter 和 setter 方法的关键字。它们允许你控制对类的属性的访问和修改。
使用 get 和 set 可以让你在读取或设置属性值时执行额外的逻辑,例如验证、计算或更新其他属性。
# Getter (get)
get 关键字用于定义一个属性的 getter 方法。getter 方法允许你控制如何获取属性的值。即使你的类中没有显式声明一个属性,你也可以通过 getter 方法来模拟它。
class Rectangle {
num left, top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
// 使用 get 来定义一个属性的 getter
num get area => width * height;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# Setter (set)
set 关键字用于定义一个属性的 setter 方法。setter 方法允许你控制如何设置属性的值。你可以在设置属性值之前执行验证或其他逻辑。
class Rectangle {
num left, top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
num get area => width * height;
// 使用 set 来定义一个属性的 setter
set width(num newWidth) {
if (newWidth > 0) {
width = newWidth;
} else {
throw Exception('Width must be greater than zero');
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 使用 get 和 set 的好处
- 封装:隐藏内部实现细节,只暴露必要的接口。
- 验证:在设置属性值之前进行验证。
- 计算属性:属性的值不是直接存储的,而是通过计算得到的。
- 懒加载:只有在需要时才计算属性的值,可以提高性能
# 实例
class People {
// 定义一个 私有成员name
String? _name;
// 赋值 , People.name = 'Yang'
set name(String value) => _name = value;
// 取值, People.name
String get name => 'people is $_name';
}
void main(List<String> args) {
var p = People();
p.name = 'YoungYang';
print(p.name);
}
people is YoungYang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 业务场景
购物车
/// 商品数量
int get lineItemsCount => lineItems.length;
/// 运费
double get shipping => 0;
/// 折扣
double get discount =>
lineCoupons.fold<double>(0, (double previousValue, CouponsModel element) {
return previousValue + (double.parse(element.amount ?? "0"));
});
/// 商品合计价格
double get totalItemsPrice =>
lineItems.fold<double>(0, (double previousValue, LineItem element) {
return previousValue + double.parse(element.total ?? "0");
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
以前可能会写个方法 getXXX() 当然也适用于赋值操作