Java常用工具类库与Apache Commons Lang

Apache Commons Lang 是一个高价值的 Java 工具库,值得引入——它提供 StringUtils、ObjectUtils、NumberUtils 等类,安全处理字符串判空、对象比较、数字转换等高频易错操作,显著规避 NullPointerException 和 NumberFormatException。

Apache Commons Lang 是什么,值不值得引入

它不是 JDK 自带的,但几乎每个 Java 项目都该用——尤其是处理字符串、数字、对象判空、日期格式化这些高频又易错的操作。StringUtilsObjectUtilsNumberUtils 这些类能直接避开 NullPointerExceptionNumberFormatException 的坑,比手写 if (str != null && !str.trim().isEmpty())

清晰安全得多。

引入成本极低:


  org.apache.commons
  commons-lang3
  3.14.0
注意必须用 commons-lang3(不是 commons-lang),后者已停止维护,且包名是 org.apache.commons.lang,和 3.x 的 org.apache.commons.lang3 不兼容。

字符串判空与安全截断:别再用 == null + length() 了

StringUtils 提供真正语义化的空判断:isBlank() 同时覆盖 null、空字符串、纯空白字符;isEmpty() 只判 null 或长度为 0。两者行为差异大,选错会导致逻辑漏洞。

截断字符串也常被忽略边界:手动 substring(0, 10) 在长度不足时抛 StringIndexOutOfBoundsException,而 StringUtils.substring(str, 0, 10) 安全返回原字符串。

  • StringUtils.isBlank(null)true
  • StringUtils.isBlank(" \t\n")true
  • StringUtils.substring("abc", 0, 10)"abc"(不抛异常)
  • "abc".substring(0, 10) → 抛异常

对象工具类:equals、hashCode、toString 的标准化写法

手写 equals() 容易漏掉 null 检查或类型判断,ObjectUtils.equals(a, b) 内部已处理所有边界:nullnull 返回 true,任一为 null 返回 false,其余调用对象自身的 equals()

ObjectUtils.toString(obj)obj.toString() 安全,null 输入返回空字符串而非异常;ObjectUtils.defaultIfNull(obj, defaultValue) 是三元表达式的优雅替代。

生成 toString() 推荐用 ToStringBuilder.reflectionToString(this),自动遍历所有字段,避免漏字段或拼错名。

数字转换与默认值:NumberFormatException 的终结者

Integer.parseInt("abc") 直接炸;NumberUtils.createInteger("abc") 返回 nullNumberUtils.toInt("abc", -1) 返回默认值 -1。三者适用场景不同:

  • 需要明确失败信号 → 用 createXxx()(返回 null
  • 必须有 fallback 值 → 用 toXxx(str, defaultValue)
  • 想保留原始异常信息 → 还是用 JDK 原生,但要 try-catch

NumberUtils.isCreatable("123.45") 返回 true,但 createDouble("123.45") 才真转;注意 isNumber() 判的是“是否符合数字字面量语法”,不是“能否转成某类型”。

复杂点在于浮点精度和科学计数法支持——NumberUtils 全部兼容,但 JDK 原生 Double.parseDouble()"1e2" 支持,对 "1.2e-3" 也支持,NumberUtils 行为一致,无需额外适配。