Dart笔记:Dart 语言中的存取器及其用法解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Dart笔记:Dart 语言中的存取器及其用法解析

dartDart 语言中的存取器


1. 概述

1.1 什么是存取器

存取器(Accessors)是 Dart 语言中一种特殊的方法,它们允许您在访问和修改对象的属性时执行一些操作。存取器主要分为两种:getter(获取器)和 setter(设置器)。

1.2 存取器的类型

从功能上存取器分为“取”和“存”这两个功能,对应有getter和setter这两个类别:

存取器类型 描述
getter 用于获取对象属性值的方法。
setter 用于设置对象属性值的方法。

1.3 为什么需要存取器

我们可以从以下方面来介绍为什么有的时候我们需要用到存储器:

项目 描述
数据封装 存取器可以帮助实现数据封装,即将对象的属性和实现细节隐藏起来,只暴露一组公共接口。这样,外部代码无法直接访问和修改对象的内部状态,从而保护了对象的完整性。
验证和操作数据 存取器允许您在获取或设置属性值时执行一些操作,例如验证数据是否有效、执行计算或触发其他操作。

2. Dart 存取器的语法格式

2.1 getter 语法

在一个类中,getter 方法是使用 get 关键字进行声明的,它不接收任何参数:

Type get propertyName {  // 返回属性值}

请参考 2.2 setter 语法 小节的示例。

2.2 setter 语法

在一个类中,getter 方法是使用 set 关键字进行声明的,需要接收一个参数,作为设置的值:

set propertyName(Type value) {  // 设置属性值}

例如:

import 'package:dio/dio.dart';
import 'package:dio/io.dart';
class ApiService {
  Dio _dio = Dio();
  int _connectTimeout = 5000; 
  int _receiveTimeout = 3000;
  bool _useProxy = false; // 默认不使用代理
  String _proxyUrl = "";  // 代理 URL
  /// 获取当前是否使用代理
  bool get useProxy => _useProxy;
  /// 设置是否使用代理
  set useProxy(bool value) {
    _useProxy = value;
  }
  /// 获取当前代理 URL
  String get proxyUrl => _proxyUrl;
  /// 设置代理 URL
  set proxyUrl(String value) {
    _proxyUrl = value;
  }
  // ...其它方法
}

3. 存取器与访问权限控制

和 dart 中的其它方法一样,存取器也可以定义为共有或者私有访问权限,其中你可以对比 私有字段 和 公共存取器 的区别:

项目 描述
私有字段 在 Dart 中,以 _ 开头的字段和方法默认为私有。通过结合私有字段和公共存取器,您可以实现对对象属性的访问权限控制。
公共存取器 公共存取器是指没有前缀 _ 的 getter 和 setter 方法。通过公共存取器,您可以控制外部代码如何访问和修改对象的属性。

4. 存取器进阶

4.1 自动存取器

Dart 支持自动存取器,它允许您为一个属性自动生成 getter 和 setter 方法,而无需显式定义。要使用自动存取器,只需将属性声明为公共(不以 _ 开头)即可。

例如:

class Person {
  // 自动存取器
  String name;
}
void main() {
  var person = Person();
  person.name = "Jack"; // 自动调用 setter
  print(person.name); // 自动调用 getter
}

4.2 存取器与继承

在继承中,子类可以覆盖父类的存取器。这允许您在子类中修改或扩展父类属性的行为。覆盖存取器时,需要使用 @override 注解,并确保覆盖后的存取器具有与父类相同的签名。

例如:

class Animal {
  String _name;
  String get name => _name;
  set name(String value) {
    _name = value;
  }
}
class Dog extends Animal {
  @override
  set name(String value) {
    if (value.isEmpty) {
      throw ArgumentError("名字不能为空!");
    }
    super.name = value;
  }
}
void main() {
  var dog = Dog();
  dog.name = "Trump"; // 调用子类的 setter
  print(dog.name); // 调用父类的 getter
}

在上面的示例中,Dog 类继承自 Animal 类,并覆盖了父类的 name setter。当为 Dog 对象设置名称时,将调用子类的 setter 方法,该方法会检查名称是否为空,然后调用父类的 setter 方法。当获取 Dog 对象的名称时,将调用父类的 getter 方法。

目录
相关文章
|
28天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
229 37
|
12天前
|
安全 网络安全 开发工具
深入探索Git:全面解析Git的用法与最佳实践
深入探索Git:全面解析Git的用法与最佳实践
32 2
http数据包抓包解析课程笔记
http数据包抓包解析课程笔记
|
3天前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
8 0
|
1月前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
2月前
|
开发者 API 开发框架
Xamarin 在教育应用开发中的应用:从课程笔记到互动测验,全面解析使用Xamarin.Forms构建多功能教育平台的技术细节与实战示例
【8月更文挑战第31天】Xamarin 作为一款强大的跨平台移动开发框架,在教育应用开发中展现了巨大潜力。它允许开发者使用单一的 C# 代码库构建 iOS、Android 和 Windows 应用,确保不同设备上的一致体验。Xamarin 提供广泛的 API 支持,便于访问摄像头、GPS 等原生功能。本文通过一个简单的教育应用示例——课程笔记和测验功能,展示了 Xamarin 在实际开发中的应用过程。从定义用户界面到实现保存笔记和检查答案的逻辑,Xamarin 展现了其在教育应用开发中的高效性和灵活性。
33 0
|
2月前
|
SQL 关系型数据库 MySQL
|
2月前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
28天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
1月前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
149 60

热门文章

最新文章

推荐镜像

更多