news 2026/7/29 13:40:32

kotlin中属性声明getter、setter、backing field

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
kotlin中属性声明getter、setter、backing field

Kotlin 支持后备属性和委托属性,它们允许你在不直接使用字段的情况下管理属性。
1、后备属性

修饰符gettersetterbacking field
val✅ 有❌ 无视情况有
var✅ 有✅ 有视情况有

backing field(幕后字段,即 field)只在 getter/setter 中实际访问了它时才会生成;如果 getter 是纯计算(如 get() = x + 1 且没读 field),编译器就不会分配那个存储字段。

var name: String = "" get() = field // ✅ 读那块存储 set(v) { field = v } // ✅ 写那块存储 // field 只在 getter/setter 内部可用,不是关键字,是一个上下文相关的隐式变量。 // var:可同时定义 get + set var name: String = "" get() = field.uppercase() set(value) { field = value.trim() } // val:只能定义 get,写 set 会编译错误 val id: Long = 0L get() = field // set(v) { ... } // ❌ 不能写
写法有 backing field?原因
var x: Int = 0var 必须能存,要存就得有字段
val x: Int = 0val 初始化后值固定,要存初始值
val x: Int get() = 42getter 不依赖任何存储,纯计算
val x: Int get() = y + 1// 每次读都计算同上,读别人的字段
var x: Int = 0; get() = fieldsetter 隐式用 field,必须存
var x: Int get() = compute(); set(v) { cache = v }get/set 都没用 field,没字段

Backing field = 属性背后那块真正装数据的私有字段;field 是在 getter/setter 内引用它的唯一名字;不是所有属性都有 backing field,纯计算的属性和被委托的属性都没有。

class Demo { // 1. 有 backing field var count: Int = 0 set(v) { field = if (v < 0) 0 else v } // 写入校验 // 2. 无 backing field(派生属性) val isPositive: Boolean get() = count > 0 // 3. 无 backing field(转发到别的对象) val displayCount: Int get() = count // 每次读 count 的当前值 // 4. 有 backing field(默认 getter/setter) val id: Long = System.currentTimeMillis() }

反编译成 Java 后大致是:

class Demo { private int count; // ← backing field private final long id; // ← backing field // isPositive、displayCount 没有字段,只有方法 public int getCount() { return count; } public void setCount(int v) { this.count = v < 0 ? 0 : v; } public boolean isPositive() { return getCount() > 0; } public int getDisplayCount() { return getCount(); } // get()相当于实现了get方法 public long getId() { return id; } }

2、委托属性

委托属性(另一种声明方式)例如,使用by lazy()创建的属性就是一种委托属性,它在第一次访问时才计算其值。

val x: Int by lazy { compute() } var y: String by Delegates.observable("") { _, old, new -> ... } var z: String by map // 委托给 Map

用 by 把 get/set 完全交给委托对象,此时不能写 get()/set() 自定义块(已经被委托接管)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 13:39:54

Unity网络游戏实战:从状态同步到客户端预测的大乱斗游戏开发

1. 项目概述&#xff1a;从书本到实战的跨越 几年前&#xff0c;我拿到《Unity3D网络游戏实战》这本书时&#xff0c;感觉它像一座桥梁&#xff0c;连接着单机游戏开发与网络游戏这个更复杂、更有魅力的领域。书里的坦克大战案例很经典&#xff0c;但学完之后&#xff0c;总有种…

作者头像 李华
网站建设 2026/7/29 13:37:37

Python全栈开发2026:FastAPI + Vue3 + Docker从零到部署完整指南

Python全栈开发2026&#xff1a;FastAPI Vue3 Docker从零到部署完整指南 引言 Python全栈开发依然是2026年最适合零基础入门的技术方向——语法简洁像"伪代码"&#xff0c;生态完善能覆盖从后端到数据分析的全场景&#xff0c;就业面广&#xff08;Web开发、自动化…

作者头像 李华
网站建设 2026/7/29 13:36:36

没API的老系统数据怎么取——异构对接的数据库只读路线

# 没API的老系统数据怎么取——异构对接的数据库只读路线## 引言企业做数据集成&#xff0c;碰到的第一个拦路虎往往不是技术多复杂&#xff0c;而是手里压根没有像样的接口。一套ERP是十几年前上的&#xff0c;原厂早就停维&#xff0c;接口文档跟着离职的开发一起没了&#x…

作者头像 李华
网站建设 2026/7/29 13:36:03

零基础转型网络安全:学习路线与职业发展指南

1. 为什么选择网络安全行业&#xff1f;2026年想转行网络安全的朋友们&#xff0c;你们赶上了最好的时代。这个行业正在经历前所未有的爆发式增长&#xff0c;全球网络安全人才缺口预计在2025年将达到350万。我入行8年&#xff0c;亲眼见证了网络安全从边缘岗位变成企业核心竞争…

作者头像 李华
网站建设 2026/7/29 13:34:47

UnityWebRequest核心架构与实战:从HTTP请求到文件下载的完整指南

1. UnityWebRequest 是什么&#xff0c;以及为什么你需要它如果你正在用Unity开发游戏或者应用&#xff0c;并且需要从服务器获取数据、上传文件&#xff0c;或者与后端API进行交互&#xff0c;那么UnityWebRequest就是你绕不开的核心工具。它远不止是一个简单的“下载器”&…

作者头像 李华