当前位置: 首页 > news >正文

Kotlin getter 和 setter

文章目录

  • 定义
  • field 字段(Backing Fields)

定义

我们可以为变量定义get(无参数,有与变量同类型的放返回值)或set(有一个与变量类型相同的参数,返回Unit)函数,在取值(get)和赋值(set)时进行一些其他操作,get函数称为 getter,set函数称为 setter。

var 变量名[: 变量类型] = 初始值gettersetter// val 没有 setter
val 变量名[: 变量类型]getter

getter 和 setter 在定义时就像在写函数一样,但你需要写fun关键字或声明返回值类型。
getter 和 setter 会给变量附上类似函数的特性,在很多时候会派上大用场:

// 不用 getter
var width = 10var height = 10val area = width * heightfun main() {println(area)// 改变值width = 20height = 20print(area)
}
100
100
// 使用 getter
var width = 10var height = 10val area get() = width * heightfun main() {println(area)// 改变值width = 20height = 20print(area)
}
100
400

field 字段(Backing Fields)

有一个很有趣的问题,如果我们要在 getter 或 setter 中访问变量的值或者赋值,该怎么办?如果你尝试使用变量名进行访问(或赋值),IDEA 会提示"递归属性访问器"。如果你看到这只是个警告,不以为然的将其运行,会受到一串长长的红字,在开头则给出了java.lang.StackOverflowError,栈溢出:

val name: Stringget() {println(name)return "Kotlin"}fun main() {name
}

这是因为你在get中访问name,会再一次调用get,而新的一次调用中又访问了name······so,什么时候才是个头?为此,Kotlin 提供了field关键字,你可以像使用this一样很自然地使用field,无需声明,使用它获取值或赋值不会造成递归问题:

var name: String = "K1"get() {println("getter")return field}set(value: String) {println("setter")field = value}fun main() {// 当定义了 getter 和 setter// 每次对变量操作时,都会调用对应方法println(name)name = "K2"print(name)
}
getter // 访问值, get 被调用,先打印了 getter
K1 // 返回的 K1 被打印
setter // 赋值,set 被调用
getter // get 再次被调用,打印 getter
K2 // 返回新的值 K2

相关文章:

  • 蓝桥杯--跑步计划
  • 【网络教程】Iptables官方教程-学习笔记7-简单理解IPTABLES规则的作用流程
  • Java----抽象类和接口
  • MATLAB设计ATF教程
  • 用c语言实现通讯录
  • SpringBoot集成:搭建kafka集群 + zookeeper集群
  • 树状数组的基础
  • 使用小黄鸟(HttpCanary)、VMOS Pro虚拟机对手机APP进行抓包(附带软件)
  • LeetCode题练习与总结:买卖股票的最佳时机--121
  • 4. 流程控制语句
  • 【软考的系统分析师的考题考点解析2025】
  • 【面试干货】MySQL 三种锁的级别(表级锁、行级锁和页面锁)
  • 力扣每日一题 6/8
  • expect自动化交互应用程序工具
  • 【文件导出2】导出html文件数据
  • 时间复杂度分析经典问题——最大子序列和
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【知识碎片】第三方登录弹窗效果
  • Github访问慢解决办法
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Laravel Mix运行时关于es2015报错解决方案
  • LeetCode29.两数相除 JavaScript
  • Linux CTF 逆向入门
  • Making An Indicator With Pure CSS
  • 阿里云应用高可用服务公测发布
  • 京东美团研发面经
  • 设计模式(12)迭代器模式(讲解+应用)
  • 算法系列——算法入门之递归分而治之思想的实现
  • 学习JavaScript数据结构与算法 — 树
  • 以太坊客户端Geth命令参数详解
  • 鱼骨图 - 如何绘制?
  • AI算硅基生命吗,为什么?
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​ubuntu下安装kvm虚拟机
  • #{}和${}的区别?
  • #Linux(make工具和makefile文件以及makefile语法)
  • (4)(4.6) Triducer
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (poj1.3.2)1791(构造法模拟)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三)模仿学习-Action数据的模仿
  • (一)u-boot-nand.bin的下载
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .dwp和.webpart的区别
  • .NET Reactor简单使用教程
  • .NET 使用配置文件
  • .NET运行机制
  • .NET正则基础之——正则委托
  • .vimrc 配置项