java教程技术文章
-
Java sealed interface 扩展失败时,先检查 permits 中的类型是否可访问且确实直接 implements 或 extends 该接口,再核对 final、sealed、non-sealed 续封修饰符,最后区分 named module 与 unnamed module 的包边界。本文用最小编译矩阵逐项定位这些错误。128 收藏 -
Java record 的字段是 final,但组件对象未必不可变。把带 List 等可变组件的 record 当作 HashMap 键时,组件内容变化会让 hashCode 改变,导致 get 或 containsKey 定位失效。128 收藏 -
Java Cleaner 适合为资源释放提供 GC 兜底,但清理动作不能持有被注册对象本身。本文用静态状态类、Cleanable 和 AutoCloseable 组织一份可落地的写法,并说明显式 clean、重复清理和阻塞动作的边界。128 收藏 -
Stream.toList() 从 Java 16 起返回不可修改的 List。本文说明它与 Collectors.toList()、toUnmodifiableList() 和 toCollection(ArrayList::new) 的差异,并给出 UnsupportedOperationException、Java 版本和 null 边界的排查方法。127 收藏 -
通过自动表头映射按名称读取Java CSV字段,比较手动与位置绑定,并说明逐条导入、重复表头、空值、资源关闭和事务边界。127 收藏 -
用 Java DateTimeFormatterBuilder.appendFraction 控制时间小数位,掌握 minWidth、maxWidth、decimalPoint 的组合、截断规则与严格解析边界。127 收藏 -
文章 · java教程 | 1个月前 | spring · Spring Boot · 事务管理 · Java教程 · REQUIRES_NEW Spring事务事件 TransactionalEventListener AFTER_COMMIT Spring事件
用 @TransactionalEventListener 把业务事件绑定到成功提交阶段,并讲清提交后落库、异步监听、无事务调用、幂等与 Outbox 的边界。126 收藏 -
Jackson 多态 JSON 需要稳定类型字段和明确子类型映射。本文用通知对象的往返示例说明 Id.NAME 的用法,区分缺失类型、未知类型、集合泛型和旧数据迁移边界。126 收藏 -
虚拟线程支持 ThreadLocal,但继承策略不能靠默认值猜测。本文用 Thread.Builder 关闭不需要的 InheritableThreadLocal 继承,并用 Java 25 ScopedValue 管理只读上下文的生命周期。126 收藏 -
ClassValue 适合把与 Class 绑定的元数据懒加载并缓存起来。本文用一段可运行示例拆开 get、类型值计算、remove 的关系,并说明它与普通 Map 缓存、类卸载之间的边界。124 收藏 -
JEP 465 撤回后,已有 STR 与自定义模板处理器代码应按用途迁移到稳定 API,并保留格式化、国际化与安全边界。123 收藏 -
Java Stream.peek 是惰性中间操作,可能因没有终止操作、短路或实现优化而少执行。本文拆开触发边界,并给出把业务副作用移到可靠位置的重构方式。121 收藏 -
Java ForkJoinPool 的 asyncMode 用于调整工作线程对未 join 任务的本地调度策略。本文用代码说明默认栈式调度与本地 FIFO 的差异,并给出并行度、任务类型和生命周期的选择边界。121 收藏 -
用 Java Locale.Builder 校验用户提交的 BCP 47 语言标签,区分 setLanguageTag 与 forLanguageTag 的异常和截断行为,并给出回退语言、展示语言与测试验收方案。120 收藏 -
Locale.forLanguageTag 会按 BCP 47 规则解析并规范化语言标签。本文从缓存键异常复盘出发,解释大小写、非法子标签、Unicode 扩展和 toString/toLanguageTag 的边界,并给出可验收的修复方式。119 收藏