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

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() 自定义块(已经被委托接管)。

http://www.cnnetsun.cn/news/3730605.html

相关文章:

  • Unity网络游戏实战:从状态同步到客户端预测的大乱斗游戏开发
  • Python全栈开发2026:FastAPI + Vue3 + Docker从零到部署完整指南
  • 没API的老系统数据怎么取——异构对接的数据库只读路线
  • 液压缸不同步、走位偏差大?液压同步分流马达不同步的7大核心原因+解决方案
  • 零基础转型网络安全:学习路线与职业发展指南
  • UnityWebRequest核心架构与实战:从HTTP请求到文件下载的完整指南
  • Intel Edison嵌入式Linux平台Python开发环境搭建与物联网应用实践
  • 告别论文踩坑!2026五大AI学术工具权威测评,Gradpaper、笔墨AI实力领跑
  • Triton语言where操作:GPU高性能计算的条件筛选利器
  • 金蝶合作伙伴等级怎么划分?一文看懂完整金字塔体系
  • Glances:轻量级跨平台系统监控工具配置指南
  • 物联网设备低功耗优化:从硬件到固件的全面方案
  • A/B测试:你跑出来的显著,可能只是老板想看的
  • Python客户端高效访问Tiled科学数据服务指南
  • OpenRAG与Langflow构建高效检索增强生成系统
  • 097、YOLOv8改进实战:EMA指数移动平均与SWA随机权重平均在模型训练中的应用
  • CefFlashBrowser完全指南:3个技巧让Flash游戏重获新生
  • 简单三步搭建终极家庭游戏串流中心:Sunshine完全指南
  • Java synchronized锁机制:从对象头到重量级锁的深度解析
  • 如何快速突破百度网盘限速:Python解析工具实战指南
  • PS 贴图怎么贴到头巾上?4 种原生工具完整零基础实操教程
  • PS易拉罐贴图怎么做到无痕?零基础全套实操
  • 无人机姿态角解算:从IMU数据融合到飞控稳定的核心原理与实践
  • Grok 4.6/4.7版本更新解析:代码生成AI的环境配置与高效使用指南
  • 算法工程师思维训练与性能优化实战
  • 3步永久保存QQ空间青春回忆:开源GetQzonehistory一键备份指南
  • FDA批准异体移植细胞疗法Tregzi(Orca-T)【海得康】
  • GPT-6 要发布了吗?Spud 已是 GPT-5.5,开发者该验证的 8 个信号
  • 精华贴分享|关于卖出的蒙特卡洛实验:A股日内主动离场策略
  • 告别Office订阅烦恼:3步免费解锁Microsoft 365完整功能终极指南