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

[java 21 scopevalue(preview) 特定作用域数据共享 v01]

package com.hugh.java17.v21;import java.lang.ScopedValue;public class ScopeValueTest {// 定义一个作用域值(类似“上下文的key”)private static final ScopedValue<String> GIFT = ScopedValue.newInstance();// 赠送礼物的方法:绑定值并执行接收逻辑public static void giveGift() {// 绑定 GIFT 的值为“手机”,并在作用域内执行 receiveGift()ScopedValue.where(GIFT, "手机").run(() -> receiveGift());}// 接收礼物的方法:从作用域中获取值public static void receiveGift() {// 获取当前作用域内 GIFT 的值String gift = GIFT.get();System.out.println("收到礼物:" + gift); // 输出:收到礼物:手机}public static void main(String[] args) {giveGift(); // 调用赠送方法,触发整个流程}
}

代码理解

ScopedValue Java 中的作用域值,用于在限定作用域内传递上下文信息

ScopedValue.where(...).run(...) 的设计看起来确实和“投放后随时取用”的直觉不太一样,但这恰恰是它的核心特性——严格限定作用域。我们可以从“为什么不能分开写”和“这种设计的好处”两个角度来理解:

1. 为什么不能把 whererun 分开?

假设我们尝试“先投放再取用”,比如:

// 错误示例:尝试分开写
ScopedValue.where(GIFT, "手机"); // 假设这里只是“投放”
receiveGift(); // 再调用“取用”

这种写法会失效,因为 ScopedValue 的核心是 “绑定值只在 run 方法执行的代码块内有效”where 方法本身并不直接“投放”值,而是创建一个“绑定描述”,必须通过 run(或 call)来指定这个绑定生效的作用域范围(即 run 里的 Lambda 表达式)。

离开这个作用域后,绑定自动失效。这就像“临时借东西”:where 是“准备好要借的东西”,run 是“指定借东西的时间段和用途”,时间段外东西就还回去了。

2. 这种设计的好处:避免“全局污染”

如果允许“投放后随时取用”,就会变成类似全局变量的效果:

  • 不同地方的代码可能意外修改或读取到不该访问的值;
  • 多线程环境下,线程 A 的绑定可能被线程 B 误读,导致混乱。

where(...).run(...) 的设计强制要求:

  • 绑定的生效范围精确可控(就是 run 里的代码);
  • 超出范围后自动失效,不会影响其他代码;
  • 多线程安全:每个线程的 run 作用域是独立的,互不干扰。

3. 换个角度理解:它像一个“带参数的代码块”

可以把 ScopedValue.where(GIFT, "手机").run(()->{...}) 理解为:

“执行 {...} 里的代码时,给它传一个‘隐藏参数’ GIFT = "手机",这个参数只在 {...} 里能用。”

receiveGift() 就是这个代码块里的逻辑,它通过 GIFT.get() 拿到了这个“隐藏参数”。

这种方式比直接传参更灵活(比如多层嵌套调用时,不需要每层方法都显式声明参数),但又比全局变量更安全(严格限定范围)。

总结来说,run 方法的作用是划定绑定生效的“生命周期”,这正是 ScopedValue 区别于全局变量或普通参数传递的关键——既解决了上下文传递的问题,又避免了全局污染。习惯这种“绑定+范围”的组合写法后,就能体会到它在复杂场景(如多线程、多层调用)中的优势了。

http://www.zskr.cn/news/31419.html

相关文章:

  • 2025年可靠的酒店瓷砖厂家推荐及选购参考榜
  • outlook大附件怎么发送?主要有哪些有效的解决方案?
  • CSS 实现弧形卡片的 3 种方式
  • 2025 年北京律师事务所最新推荐榜,专业能力与服务口碑深度解析及优质机构盘点
  • 使用paddleocr提取PDF和图片文本
  • css3关键字
  • 第八周物理实验:用扭摆法测量物体的转动惯量
  • 2025 年蔬菜配送服务公司最新推荐榜,聚焦企业技术实力与市场口碑深度解析含深圳 / 宝安 / 东莞等区域优质服务商
  • 【每日一面】手写防抖函数
  • 模拟Ajax获取数据。表格显示, 带有分页功能,支持翻页,每页显示8行数据。响应式设计,适配不同屏幕尺寸
  • 2025年10月北京工装设计公司推荐榜:五强对比评测
  • 2025年10月北京工装设计公司排名:五家对比指南
  • 2025年10月防爆振动变送器厂家推荐:实力榜对比指南
  • 跨网文件交换怎么实现审批?从需求到落地的全解析!
  • MySQLDay5(基础篇完结)
  • HTML之addEventListener示例
  • 2025年10月北京工装设计公司推荐榜:筑垒领衔五强对比
  • 2025年10月山东AI公司推荐榜:优立德领衔五强对比
  • AI 超级智能体全栈方案阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
  • 【FAQ】HarmonyOS SDK 闭源开放能力 — AppGallery Kit
  • 0284-KVS-分离读取文件逻辑
  • 0283-KVS-实现 set 和 remove
  • 0281-KVS-启动时加载文件内容
  • 0280-KVS-将日志记录到文件
  • 2025 年留学咨询服务机构最新推荐榜,技术实力与服务品质双重维度剖析英国 / 澳洲 / 香港 / 美国 / 加拿大留学 / 留学中介 / 留学咨询机构推荐
  • 字符串-函数
  • 2025 年纤维喷涂厂家最新推荐榜,技术实力与市场口碑深度解析机房无机 / 隔音无机 / 地下室无机 / A 级防火无机纤维喷涂公司推荐
  • [背包] CF730J Bottles 题解
  • Day5表单—下拉菜单与文本域
  • 2025 年验厂咨询机构最新推荐榜,技术实力与市场口碑深度解析,助力企业突破国际贸易壁垒