"藏经阁-Java开发手册(泰山版)"
在《新版Java开发手册》中,针对Java开发人员提出了多个重要的规范和建议,旨在提高代码质量和可维护性。以下是一些关键知识点的详细解释:
1. **三目运算符的空指针问题**:
当使用三目运算符 `condition ? expr1 : expr2` 时,如果 `condition` 为 `null` 并尝试自动转换为布尔值,就会触发 `NullPointerException`。这是因为Java会尝试调用 `Boolean` 的 `booleanValue()` 方法,而 `null` 没有此方法。因此,手册建议在使用三目运算符时,确保条件表达式不会返回 `null`。
2. **初始化HashMap的容量大小**:
阿里巴巴推荐在创建 `HashMap` 时指定初始容量,以避免不必要的扩容操作,提高性能。合适的初始容量应根据预计的元素数量和负载因子来计算,通常可以设置为预期大小的1.5到2倍。
3. **使用Executors创建线程池**:
禁止使用 `Executors.newXXExecutorService()` 创建线程池,因为这些工厂方法创建的线程池可能导致资源泄露或内存溢出。推荐使用 `ThreadPoolExecutor` 直接构造线程池,以便更精确地控制线程池的行为和资源管理。
4. **ArrayList的subList方法**:
谨慎使用 `ArrayList` 的 `subList` 方法,因为它返回的是一个视图,而不是副本。对原列表的修改会影响到子列表,反之亦然,这可能导致意外的并发修改异常。若需要独立的列表副本,应使用 `clone()` 或其他方法。
5. **字符串拼接**:
阿里巴巴不建议在 `for` 循环中使用 `+` 进行字符串拼接,因为这会导致频繁的字符串对象创建和连接操作,影响性能。推荐使用 `StringBuilder` 或 `StringBuffer`,特别是在多线程环境中。
6. **foreach循环中的元素操作**:
禁止在 `foreach` 循环内对集合进行 `add` 或 `remove` 操作,这可能导致 `ConcurrentModificationException`。应使用迭代器(`Iterator`)进行修改,或者使用 `Stream API` 的 `filter` 和 `collect` 方法。
7. **直接使用日志系统的API**:
禁止直接使用如 `Log4j` 或 `Logback` 的日志API,因为这可能导致日志配置不一致。建议使用日志框架的封装库,如 `SLF4J`,以提供更好的可移植性和日志管理。
8. **SimpleDateFormat定义为static变量**:
`SimpleDateFormat` 是线程不安全的,将其声明为 `static` 变量可能导致多线程环境中的同步问题。若需重复使用,应考虑使用局部变量或线程局部变量(`ThreadLocal`)。
9. **使用isSuccess作为变量名**:
避免使用像 `isSuccess` 这样的布尔变量名,因为它可能会误导读者认为这是一个判断方法,而实际上它可能只是一个普通的变量。推荐使用更具描述性的名称。
10. **修改serialVersionUID字段的值**:
`serialVersionUID` 用于序列化版本的标识,若随意修改可能导致反序列化失败。除非有特殊需求,否则不应直接修改该字段的值。
11. **谨慎使用继承**:
阿里巴巴建议开发者谨慎使用继承,因为过度的继承可能导致设计复杂且难以维护。优先考虑使用组合、接口和策略模式。
12. **count方法的使用**:
禁止使用 `count(列名)` 或 `count(常量)` 来替代 `count(*)`,因为这可能导致性能下降和误导性的结果。`count(*)` 返回所有行的数量,而 `count(列名)` 只计算非空值。
这些规范是基于实践经验总结得出的,遵循这些最佳实践可以提升代码质量,减少潜在的bug,并提高团队协作效率。