Dart 中的 getter 和 setter

news2025/1/7 16:41:15

在 Dart 中,gettersetter 是用于访问对象的属性的特殊方法。通过 getter 和 setter,你可以控制如何读取和修改对象的属性,这为对象提供了更高的封装性和灵活性。

一、 Getter(获取器)

Getter 用于获取对象的属性值。它是一个特殊的方法,通过 get 关键字来定义,通常用来让外部访问对象的私有属性。getter 允许你通过像访问字段一样访问方法,但实际上它是执行方法逻辑来返回值。

例子:
class Person {
  String? _name;
  Person(this._name);
  // Getter
  String? get name =>_name;
  // 如果不希望外部代码直接修改,可以提供只读的getter
}

void main() {
  var person = Person('Alice');
  print(person.name);  // 通过 getter 访问
  //person.name = "siri"; //报错不能修改
}

在这个例子中,name 就是一个 getter,你可以像访问字段一样访问它,但实际上它是通过 _name 属性来获取数据的。

二、Setter(设置器)

Setter 用于设置对象的属性值。它是一个特殊的方法,通过 set 关键字来定义。setter 通常用于在设置对象的属性时进行额外的逻辑处理,如验证输入、修改值等。

例子:

class Person {
  String? _name;
  Person(this._name);
  // Getter
  String? get name =>_name;

  // Setter _name 是可空的 设置值时也必须时可空的 String? 可以省略不写 写了就一定要带?
  set name(String? value) {
    if (value.isEmpty) {
      print('Name cannot be empty');
    } else {
      _name = value;
    }
  }
}

void main() {
  var person = Person('Alice');
  print(person.name);  // 使用 getter 访问

  // 使用 setter 设置值
  person.name = 'Bob';  // 通过 setter 设置
  print(person.name);  // 输出 Bob

  person.name = '';  // 输出 Name cannot be empty
}

在上面的例子中,name 既有 getter 又有 setter。getter 用来获取 _name 属性的值,而 setter 用来设置 _name 的值,同时添加了一些逻辑来确保名字不会为空。

简化的 Setter

在 Dart 中,你也可以为单一属性创建简化版的 getter 和 setter,这样写法更加简洁。

例子:

class Person {
  String? _name;

  Person(this._name);

  // Getter
  String? get name => _name;

  // 简化版 Setter
  set name(String? value) => _name = value;
}

void main() {
  var person = Person('Alice');
  print(person.name);  // 输出 Alice

  person.name = 'Bob';  // 设置新名字
  print(person.name);  // 输出 Bob
}

这个例子中使用了 Dart 提供的简化语法,代码更加简洁。

三、只读 Getter 和只写 Setter

你可以选择只实现 gettersetter,从而使某个属性只能被读取或只能被设置。

只读 Getter:

class Person {
  String? _name;

  Person(this._name);

  // 只读 getter
  String? get name => _name;
}

void main() {
  var person = Person('Alice');
  print(person.name);  // 只可以读取 name person.name = "..." 会报错
}

只写 Setter:

class Person {
  String? _name;

  Person(this._name);

  // 只写 setter
  set name(String? value) => _name = value;
}

void main() {
  var person = Person('Alice');
  person.name = 'Bob';  // 只可以设置 name
  print(person.name); //读取会报错
}

四、getter 和 setter 的用法场景

  • 数据封装:通过 getter 和 setter,可以控制访问和修改数据的方式,保护内部实现的细节,避免外部直接修改对象的私有属性。
  • 输入验证:在 setter 中,可以添加逻辑来验证输入数据的有效性。
  • 延迟计算:有时你不希望在属性访问时直接存储数据,而是根据其他字段的值动态计算一个值,这时可以使用 getter 来实现延迟计算。

例子:计算属性

class Rectangle {
  double width, height;

  Rectangle(this.width, this.height);

  // 计算属性:面积(不需要存储,动态计算)
  double get area => width * height;
}

void main() {
  var rectangle = Rectangle(5, 10);
  print(rectangle.area);  // 输出 50
}

在上面的例子中,area 并不是一个实际存储的属性,而是通过 widthheight 计算得出的。这是一个典型的使用 getter 进行计算的例子。

总结

  • getter 用于返回对象的属性值,它通过 get 关键字定义。
  • setter 用于设置对象的属性值,它通过 set 关键字定义。
  • getter 是只读的 setter 是只写的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言安装教程与常见问题

生物信息基础入门笔记 R语言安装教程与常见问题 今天和大家聊一个非常基础但是很重要的技术问题——如何在不同操作系统上安装R语言?作为生物信息学数据分析的神兵利器,R语言的安装可谓是入门第一步,学术打工人的必备技能。今天分享在Windows…

VOC数据集格式转YOLO格式

将VOC格式的数据集转换为YOLO格式通常涉及以下几个步骤。YOLO格式的标注文件是每个图像对应一个.txt文件&#xff0c;文件中每一行表示一个目标&#xff0c;格式为&#xff1a; <class_id> <x_center> <y_center> <width> <height>其中&#xf…

win10搭建zephyr开发环境

搭建环境基于 zephyr官方文档 基于官方文档一步一步走很快就可以搞定 一、安装chocolatey 打开官网 https://community.chocolatey.org/courses/installation/installing?methodinstall-from-powershell-v3 1、用管理员身份打开PowerShell &#xff08;1&#xff09;执行 …

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

k8s集群监控系统部署方案

1.方案介绍 本文介绍一种k8s集群监控系统,该系统可以监控k8s集群中的pod和node的性能指标,以及K8s资源对象的使用情况。 监控流程: 集群资源数据采集(cadvisor、node-exporter、kube-state-metrics)-- 数据收集、存储、处理等(prometheus)-- 数据可视化查询和展示(gra…

RP2K:一个面向细粒度图像的大规模零售商品数据集

这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同&#xff0c;我们收集了2000多种不同零售产品的35万张图像&#xff0c;这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究&#xff0c;该研究具…

Linux(Centos 7.6)命令详解:ls

1.命令作用 列出目录内容(list directory contents) 2.命令语法 Usage: ls [OPTION]... [FILE]... 3.参数详解 OPTION: -l&#xff0c;long list 使用长列表格式-a&#xff0c;all 不忽略.开头的条目&#xff08;打印所有条目&#xff0c;包括.开头的隐藏条目&#xff09…

比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit

文章目录 EGT-Ensemble Graphics Toolkit介绍EGT具备非常高的图形渲染效率EGT采用了非常优秀的开源2D图形处理引擎-Cairo开源2D图形处理引擎Cairo的优势Cairo 2D图像引擎的性能Cairo 2D图像引擎的实际应用案例彩蛋 - 开源EDA软件KiCAD也在使用Cairo EGT高效的秘诀还有哪些Cairo…

密码学精简版

密码学是数学上的一个分支&#xff0c;同时也是计算机安全方向上很重要的基础原理&#xff0c;设置密码的目的是保证信息的机密性、完整性和不可抵赖性&#xff0c;安全方向上另外的功能——可用性则无法保证&#xff0c;可用性有两种方案保证&#xff0c;冗余和备份&#xff0…

WPF通过反射机制动态加载控件

Activator.CreateInstance 是 .NET 提供的一个静态方法&#xff0c;它属于 System 命名空间。此方法通过反射机制根据提供的类型信息。 写一个小demo演示一下 要求&#xff1a;在用户反馈界面点击建议或者评分按钮 弹出相应界面 编写MainWindow.xmal 主窗体 <Window x:C…

C语言 递归编程练习

1.将参数字符串中的字符反向排列&#xff0c;不是逆序打印。 要求&#xff1a;不能使用C函数库中的字符串操作函数。 比如&#xff1a; char arr[] "abcdef"; 逆序之后数组的内容变成&#xff1a;fedcba 1.非函数实现&#xff08;循环&#xff09; 2.用递归方法…

数据插入操作的深度分析:INSERT 语句使用及实践

title: 数据插入操作的深度分析:INSERT 语句使用及实践 date: 2025/1/5 updated: 2025/1/5 author: cmdragon excerpt: 在数据库管理系统中,数据插入(INSERT)操作是数据持久化的基础,也是应用程序与用户交互的核心功能之一。它不仅影响数据的完整性与一致性,还在数据建…

【Linux系列】使用 `nohup` 命令运行 Python 脚本并保存输出日志的详细解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【USRP】教程:在Macos M1(Apple芯片)上安装UHD驱动(最正确的安装方法)

Apple芯片 前言安装Homebrew安装uhd安装gnuradio使用b200mini安装好的路径下载固件后续启动频谱仪功能启动 gnu radio关于博主 前言 请参考本文进行安装&#xff0c;好多人买了Apple芯片的电脑&#xff0c;这种情况下&#xff0c;可以使用UHD吗&#xff1f;答案是肯定的&#…

多媒体素材库系统

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; I…

EdgeX规则引擎eKuiper

EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…

即插即用,无痛增强模型生成美感!字节跳动提出VMix:细粒度美学控制,光影、色彩全搞定

文章链接&#xff1a;https://arxiv.org/pdf/2412.20800 代码地址&#xff1a;https://github.com/fenfenfenfan/VMix 项目地址&#xff1a;https://vmix-diffusion.github.io/VMix/ 亮点直击 分析并探索现有模型在光影、色彩等细粒度美学维度上生成图像的差异&#xff0c;提出…

I.MX6ull-PWM

一、PWM介绍 PWM&#xff08;Pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的 一种非常有效的技术&#xff0c;广泛应用在测量、通信、工控等方面。 pwm的工作电路 它的四种时钟信号 (1)High-frequency referenc…

性能测试04|JMeter:连接数据库、逻辑控制器、定时器

目录 一、连接数据库 1、使用场景 2、直连数据库的关键配置 3、案例 ​编辑 二、逻辑控制器 1、if控制器 2、循环控制器 3、ForEach控制器 三、定时器 1、同步定时器 2、常数吞吐量定时器&#xff08;用的少&#xff0c;了解即可&#xff09; 3、固定定时器 一、连…

基于SpringBoot和OAuth2,实现通过Github授权登录应用

基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用 文章目录 基于SpringBoot和OAuth2&#xff0c;实现通过Github授权登录应用0. 引言1. 创建Github应用2. 创建SpringBoot测试项目2.1 初始化项目2.2 设置配置文件信息2.3 创建Controller层2.4 创建Html页面 3. 启动…