当前位置: 首页 > 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.jsqmd.com/news/23267/

相关文章:

  • 2025年可靠的酒店瓷砖厂家推荐及选购参考榜
  • 2025年比较大的行政律师事务所律师费
  • 2025年比较好的铁罐厂家推荐及选择指南
  • outlook大附件怎么发送?主要有哪些有效的解决方案?
  • 2025 年生态木厂家最新推荐榜,技术实力与市场口碑深度解析的优质品牌方通 / 户外地板 / 装饰线条 / 隔断 / 背景墙公司推荐
  • 2025年综合性的智能运维数据中心展采购对接
  • 【2025-10-25】连岳摘抄
  • 2025年热门的供配电智算中心展采购对接
  • CSS 实现弧形卡片的 3 种方式
  • 2025 年北京律师事务所最新推荐榜,专业能力与服务口碑深度解析及优质机构盘点
  • 使用paddleocr提取PDF和图片文本
  • 国产化Excel开发组件Spire.XLS教程:使用Python将CSV转换为XML(处理现实数据问题)
  • 2025年评价高的弥散供氧系统厂家最新推荐排行榜
  • 2025 年洗碗机厂家最新推荐榜,聚焦企业技术实力与市场口碑深度解析酒店 / 学校 / 工厂 / 全自动洗碗机公司推荐
  • css3关键字
  • 文档处理控件Aspose.Words教程:Python将Markdown转换为Word
  • 第八周物理实验:用扭摆法测量物体的转动惯量
  • 2025 年蔬菜配送服务公司最新推荐榜,聚焦企业技术实力与市场口碑深度解析含深圳 / 宝安 / 东莞等区域优质服务商
  • 【每日一面】手写防抖函数
  • 最佳技术文档解决方案:用 PandaWiki 打造智能化产品文档体系
  • 模拟Ajax获取数据。表格显示, 带有分页功能,支持翻页,每页显示8行数据。响应式设计,适配不同屏幕尺寸
  • 2025年10月北京工装设计公司推荐榜:五强对比评测
  • 苏州GEO企业深度解析:行业中如何选择专业服务商 - 勤懒调和者
  • 高效便捷的安全数据交换系统,助力企业合规管理
  • 2025年10月北京工装设计公司排名:五家对比指南
  • 2025年10月防爆振动变送器厂家推荐:实力榜对比指南
  • 跨网文件交换怎么实现审批?从需求到落地的全解析!
  • MySQLDay5(基础篇完结)
  • 2025 年优质球墨铸铁管厂家最新推荐榜,技术实力与市场口碑深度解析
  • HTML之addEventListener示例