在 Dart 中,getter 和 setter 是用于访问和修改对象属性的特殊方法。它们可以让你在读取或设置属性时执行额外的操作,例如数据验证、计算等。
定义 Getter 和 Setter
定义 Getter
Getter 方法用于获取对象的属性值。定义一个 getter 的语法如下:
class MyClass {
// 属性
int _myProperty;
// Getter
int get myProperty => _myProperty;
}这里,_myProperty 是私有属性,通过 getter myProperty 来访问它。
定义 Setter
Setter 方法用于设置对象的属性值。定义一个 setter 的语法如下:
// www.javascriptcn.com code example
class MyClass {
// 属性
int _myProperty;
// Getter
int get myProperty => _myProperty;
// Setter
set myProperty(int value) {
_myProperty = value;
}
}这里,通过 setter myProperty 来设置 _myProperty 的值。
使用 Getter 和 Setter
你可以像使用普通属性一样使用 getter 和 setter。下面是一个例子:
// www.javascriptcn.com code example
void main() {
var obj = MyClass();
// 使用 getter
print(obj.myProperty); // 输出: null
// 使用 setter
obj.myProperty = 42;
print(obj.myProperty); // 输出: 42
}自定义逻辑
除了简单的赋值操作,你还可以在 getter 和 setter 中添加自定义逻辑。例如,你可以在设置属性值时进行数据验证:
// www.javascriptcn.com code example
class MyClass {
int _myProperty;
int get myProperty => _myProperty;
set myProperty(int value) {
if (value < 0) {
throw ArgumentError('Value must be non-negative');
}
_myProperty = value;
}
}
void main() {
var obj = MyClass();
try {
obj.myProperty = -1; // 抛出异常
} catch (e) {
print(e); // 输出: Value must be non-negative
}
obj.myProperty = 42;
print(obj.myProperty); // 输出: 42
}在这个例子中,如果尝试将 myProperty 设置为负数,则会抛出异常。
复合属性
有时候你可能需要根据其他属性来计算某个属性的值。在这种情况下,你可以使用 getter 来返回这个复合值:
// www.javascriptcn.com code example
class Rectangle {
double width;
double height;
Rectangle(this.width, this.height);
// Getter 返回面积
double get area => width * height;
}
void main() {
var rect = Rectangle(4, 5);
print(rect.area); // 输出: 20.0
}Getter 和 Setter 的组合
你也可以在同一个类中同时定义 getter 和 setter,以实现更复杂的属性管理逻辑:
// www.javascriptcn.com code example
class Person {
String _name;
// Getter
String get name => _name;
// Setter
set name(String value) {
if (value.isEmpty) {
throw ArgumentError('Name cannot be empty');
}
_name = value;
}
}
void main() {
var person = Person();
try {
person.name = ''; // 抛出异常
} catch (e) {
print(e); // 输出: Name cannot be empty
}
person.name = 'Alice';
print(person.name); // 输出: Alice
}在这个例子中,通过 getter 和 setter 实现了对 name 属性的安全管理。
总结
通过 getter 和 setter,你可以更加灵活地管理和控制对象的属性。这不仅可以使代码更安全、更易维护,还能帮助你在属性发生变化时执行一些必要的操作。希望本章的内容能够帮助你更好地理解和使用 Dart 中的 getter 和 setter。