Flutter/Dart中get/set关键字作用解析:Java开发者入门问询
Dart中的get/set关键字详解(针对Java开发者)
作为有Java基础的开发者,你可以把Dart的get/set理解为Java中getter/setter方法的语法糖,但用法更简洁、更贴近属性访问的直观逻辑。下面结合Java的写法对比讲解:
get关键字:替代Java的getXxx()方法
在Java中,你通常会为私有字段编写getXxx()方法来暴露读取权限:
public class Person { private String name; public String getName() { return name; } }
Dart的get关键字直接将读取逻辑封装为属性形式,外部无需调用方法,直接通过属性名访问:
class Person { String _name; // Dart用下划线标记私有成员 String get name => _name; // 定义name属性的读取逻辑 }
外部代码可以像访问普通属性一样写person.name,底层会自动执行get的逻辑。而且get不仅能返回字段值,还能实现计算属性:
class Rectangle { double width; double height; double get area => width * height; // 每次访问都会实时计算面积,无需存储 }
这种场景在Java中需要写getArea()方法,Dart用get让代码更直观。
set关键字:替代Java的setXxx()方法
对应Java的setXxx()方法,Dart的set关键字将写入逻辑封装为属性赋值的形式:
Java写法:
public class Person { private int age; public void setAge(int age) { if (age >= 0) { this.age = age; } } }
Dart写法:
class Person { int _age; set age(int value) { if (value >= 0) { // 写入前做合法性校验 _age = value; } } }
外部代码直接写person.age = 25,就会触发set的逻辑,自动完成校验和赋值。
综合示例
class Person { String _name; int _age; // 读取name,返回私有字段值 String get name => _name; // 写入name,校验非空 set name(String value) { if (value.isNotEmpty) { _name = value; } else { throw ArgumentError('Name cannot be empty'); } } // 读取时返回格式化的年龄信息 String get ageInfo => 'Current age: $_age'; // 写入年龄,校验范围 set age(int value) { if (value >= 0 && value <= 120) { _age = value; } else { throw ArgumentError('Age must be between 0 and 120'); } } } void main() { var person = Person(); person.name = 'Alice'; // 触发set name print(person.name); // 触发get name,输出Alice person.age = 30; // 触发set age print(person.ageInfo); // 触发get ageInfo,输出Current age: 30 }
核心要点
get/set是属性访问器的语法糖,让代码比Java的getter/setter更简洁直观。get用于定义属性的读取逻辑,支持返回字段值或计算结果,外部通过对象.属性名访问。set用于定义属性的写入逻辑,可做参数校验、数据转换等操作,外部通过对象.属性名 = 值赋值。- Dart中私有成员用下划线
_开头,get/set通常用来封装私有成员,控制访问权限和逻辑。
内容的提问来源于stack exchange,提问作者SpookySkeleton
相关产品推荐
相关产品推荐

