You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:09:32