ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java开发必知的6个注解陷阱

Java开发必知的6个注解陷阱 注解让Java代码更简洁但用错注解轻则功能失效重则线上事故。以下6个注解陷阱每个都让开发者掉过坑。1. Override 漏写重载被当成重写java复制下载class Parent { void print(String s) { System.out.println(Parent); } } class Child extends Parent { void print(String s) { System.out.println(Child); } // 本意是重写 }看起来没问题但如果父类方法签名是print(Object)子类写成了print(String)那就是重载而非重写。多态调用时父类引用仍然执行父类方法。改法强制自己给所有重写方法加Override编译器会立刻报错。谁改谁知道这个小注解能省下几小时调试。2. Transactional 自调用失效java复制下载Service public class OrderService { public void createOrder() { this.saveOrder(); // 自调用事务失效 } Transactional public void saveOrder() { ... } }Spring 的Transactional基于 AOP 代理自调用不走代理对象事务根本不生效。类似失效场景还有private 方法、异常被吞、rollbackFor 没配。改法把事务方法抽到另一个 Bean 中调用或注入自身代理AopContext.currentProxy()最简单的是重构别在同一个类里自调用。3. Autowired(requiredfalse) 埋下 NPEjava复制下载Service public class UserService { Autowired(required false) private SmsService smsService; public void register() { smsService.send(); // 当SmsService不存在时直接NPE } }requiredfalse本意是可选依赖但很多人忘了判空。一旦容器里没有这个 Bean字段就是null调用时直接空指针。改法要么用OptionalSmsService注入要么显式判空。更好的做法是构造器注入 Nullable让依赖关系一目了然。4. Configuration 与 Component 混用Bean 多例变单例java复制下载Component // 错误应该用 Configuration public class AppConfig { Bean public Task task() { return new Task(); } }Configuration的类会被 CGLIB 代理保证Bean方法返回单例。换成Component代理失效每次调用task()都创建新对象。如果你在别处多次调用就会得到多个实例状态不共享。改法配置类一律用Configuration。别图省事用Component坑的是自己。5. SuppressWarnings(unchecked) 滥用java复制下载SuppressWarnings(unchecked) public ListUser getUsers() { return (ListUser) redisTemplate.opsForValue().get(users); }泛型强转警告被压制但运行时如果 Redis 里存的是ListString取出后直接ClassCastException。SuppressWarnings不是修复是掩盖。改法先判断类型或用TypeReference反序列化。只在确信类型安全时使用并加上注释说明原因。别把警告当噪音它可能是唯一的线索。6. Data 生成 equals/hashCode 的坑java复制下载Data public class User { private Long id; private String name; private ListOrder orders; }Lombok 的Data自动生成equals和hashCode包含所有字段。如果orders是可变集合两个 User 只要订单列表不同就不相等。更糟的是把 User 放入 HashSet 后修改 ordershashCode变化再也找不到。改法用EqualsAndHashCode(of id)只比较唯一标识或手动重写。别让 Lombok 替你做业务决策。结语注解是双刃剑用对了事半功倍用错了处处是坑。这6个陷阱每一个都真实发生过。记住注解不是魔法理解它的原理才能驾驭它。
返回列表