-
Java的try-with-resources在多重异常时保留主异常并抑制close异常,主异常反映业务根因,抑制异常体现善后失败;资源按声明逆序关闭,抑制异常通过getSuppressed()获取,需主动日志记录,避免finally中throw导致异常覆盖。
-
方法引用无独立量化价值,其作用是优化代码结构的语法糖;通过减少重复Lambda、增强语义可读性、约束参数契约来降低维护成本,并可通过变更集中度、静态告警减少量、CodeReview耗时等间接指标评估收益。
-
使用Collections.emptyMap()等单例空集合可降低GC压力,因其返回JVM预创建的全局共享不可变实例,避免堆分配、减少MinorGC扫描与复制开销,并消除构造同步块等隐式成本。
-
final字段必须在构造完成前初始化,本质是触发JVM插入StoreStore+StoreLoad写屏障,确保其值对其他线程立即可见;而普通字段无此保障。
-
Feign和Retrofit的核心能力基于Java反射与JDK动态代理协同实现:反射解析接口注解、方法签名以生成请求蓝图,动态代理创建运行时实现类并由InvocationHandler统一调度请求链路。
-
静态代码块在类加载的初始化阶段执行且仅一次,用于驱动注册、配置加载等一次性初始化;按声明顺序执行,早于构造器,线程安全,但抛异常会导致类初始化失败。
-
控制大型复杂类的属性个数本质是减少类加载准备阶段的静态内存分配总量,从而降低初始化延迟;需聚焦静态字段必要性、拆分模块、优化类型及验证效果。
-
默认情况下核心线程长期闲置也不回收,这是由源码硬性保障的设计红线:1.核心线程用workQueue.take()无限阻塞,非核心线程才用poll(timeout);2.processWorkerExit()中allowCoreThreadTimeOut=false时,线程数≥corePoolSize即直接返回,不销毁;3.只要线程池处于RUNNING状态,ctl机制就绑定核心线程与池生命周期。
-
Files.createTempFile()用于创建唯一安全的临时文件,支持默认或自定义目录、指定前缀/后缀及POSIX权限;需手动清理,不可依赖随机性保障安全。
-
类型强转不能用于分片引擎设计,因其导致信息丢失、行为不可控、不满足确定性要求;正确做法是用显式位运算配合固定长度哈希实现可控位级切分。
-
使用Collectors.summingInt可对流中对象的int字段求和,需传入返回int的ToIntFunction;字段为Integer等类型时须显式处理null;空流返回0,但对象为null会抛NPE,应提前过滤或判空。
-
Java数组长度不可变是JVM内存模型与运行时安全机制决定的底层约束,length为publicfinalint字段,创建后固化,内存布局要求连续定长空间,边界检查依赖其绝对稳定。
-
-XX:MaxDirectMemorySize不能精准约束Netty堆外内存,因多ClassLoader会创建多个PooledByteBufAllocator实例,各自按该参数值独立配额,导致总量远超限制;需统一ClassLoader、显式构造单例allocator并配合-Dio.netty.maxDirectMemory等措施对齐控制。
-
构造器注入的核心价值是确保对象创建时具备完整、不可变的必要依赖。通过final字段+构造器参数锁定必需协作对象,编译期和运行期双重保障完整性;Lombok@RequiredArgsConstructor自动生成构造器,避免手误;可选依赖用setter补充;单元测试只需传入Mock,即时暴露缺失依赖。
-
Double.isNaN仅检测结果是否为NaN,不捕获计算异常;典型NaN来源包括0.0/0.0、Math.sqrt(-1.0)等;需配合Double.isInfinite判断无穷大,并注意Double包装类null导致NPE。