写了几年Java,回头看自己早期的代码,总有一种想删库跑路的冲动。明明功能都实现了,为什么代码看起来就是不够“专业”?其实,代码写不好,往往不是技术能力问题,而是一些根深蒂固的坏习惯在作祟。以下这7个习惯,如果你也有,建议趁早改掉。
1. 命名全靠拼音和缩写
String yhm;int zhye;List<Map<String,Object>> cxJg;
这种命名方式在小型项目里或许能跑起来,但一旦项目变大、人员更替,维护者面对这些变量名只能靠猜。更糟糕的是,有些人用拼音首字母缩写,最后连自己都忘了cxJg到底是“查询结果”还是“撤销结构”。
改法:用有意义的英文命名。用户名的叫username,账户余额叫accountBalance。类名用大驼峰,方法名和变量用小驼峰,常量全大写。命名是代码可读性的第一道门槛,别在这省事。
2. 一个方法写三百行
有些人的方法像裹脚布,又臭又长。一个processOrder()方法里塞了参数校验、库存检查、价格计算、数据库写入、消息推送、日志记录……三百行代码一气呵成,中间连个空行都不舍得加。
这种代码的坏处显而易见:无法复用、难以测试、调试时只能一行行加日志。
改法:遵循单一职责原则。一个方法只做一件事。超过30行就考虑拆分,把校验逻辑抽成validateOrder(),把计算逻辑抽成calculatePrice()。方法短了,bug自然无处藏身。
3. 到处硬编码
if (user.getType() == 3) { ... } String url = "http://192.168.1.100:8080/api";魔法数字和硬编码字符串是代码里的定时炸弹。哪天用户类型从3改成5,或者服务器IP变了,你就得满世界搜替换。
改法:用常量或枚举替代魔法值。配置信息抽到配置文件或配置中心。UserType.ADMIN比3可读得多,@Value("${api.url}")比写死的IP灵活得多。
4. 异常处理就是e.printStackTrace()
try { // 业务代码 } catch (Exception e) { e.printStackTrace(); }这是最常见的“伪异常处理”。打印堆栈后继续往下跑,出了问题日志里一堆红字,却不知道哪个请求出的错、影响范围多大。更可怕的是吞异常——catch了什么都不做。
改法:该抛的抛,该包装的包装。用日志框架记录上下文信息,至少包含请求ID和关键参数。对于可恢复的异常做降级处理,不可恢复的让上层感知。别让异常静默死亡。
5. 从不写注释,或者写废话注释
两种极端:一种是一行注释没有,代码像天书;另一种是// 设置name后面跟着user.setName(name);——废话文学。
改法:注释应该解释“为什么”,而不是“做什么”。代码本身能说明做什么,但为什么用这种算法、为什么这里要特殊处理、为什么这个值设成500,这些才是注释该承载的信息。公共API用Javadoc,复杂逻辑加行内说明。
6. 过早优化,过度设计
明明是个内部管理系统,非要上微服务、消息队列、分布式缓存。一个CRUD接口,硬要套上策略模式+工厂模式+责任链模式,三层接口两层抽象,最后连自己都绕晕。
改法:KISS原则——Keep It Simple, Stupid。先让代码跑起来,再根据实际性能瓶颈做优化。设计模式是工具不是目的,别为了用而用。
7. 从不写单元测试
“测试是QA的事”——这种想法害人不浅。没有单元测试的代码,每次改动都像拆盲盒。更可怕的是,有些人写了测试,但测试里全是assertTrue(true)。
改法:核心业务逻辑必须有单元测试。JUnit + Mockito,覆盖正常路径和边界条件。测试不仅是验证,更是文档——它告诉你代码应该怎么用。
代码写不好不可怕,可怕的是觉得“能跑就行”。以上7个习惯,改掉任何一个都能让代码质量上一个台阶。从今天开始,命名认真一点,方法拆细一点,异常处理用心一点。三个月后回头看,你会感谢现在的自己。