Java 15 中如何使用 String.formatted() 使字符串模板填充更简洁高效?

2026-05-07 10:081阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计663个文字,预计阅读时间需要3分钟。

Java 15 中如何使用 String.formatted() 使字符串模板填充更简洁高效?

`String.formatted() 是 Java 15 引入的便捷方法,用于替代传统的 String.format()。该方法语法更简洁、可读性更强,且在编译期不做检查(运行时行为一致)。它直接作用于字符串字面量或变量,调用后返回填充后的结果字符串。

基本用法:替代 String.format() 的链式调用

以前写:

String result = String.format("Hello %s, you have %d new messages", name, count);

现在可写成:

String result = "Hello %s, you have %d new messages".formatted(name, count);

关键点:

立即学习“Java免费学习笔记(深入)”;

  • 调用者必须是字符串对象(不能是 null),否则抛 NullPointerException
  • 格式说明符(如 %s%d%.2f)与 String.format() 完全兼容
  • 参数个数和类型需匹配,不匹配会在运行时抛 IllegalFormatConversionExceptionMissingFormatArgumentException

配合常量字符串提升可维护性

把模板提取为 private static final 字符串,再调用 formatted(),既清晰又利于复用:

private static final String WELCOME_MSG = "Welcome, %s! Account balance: $%.2f";
...
String msg = WELCOME_MSG.formatted(username, balance);

相比拼接或硬编码格式,这种方式保留了类型安全提示(IDE 可校验占位符数量),也避免了重复书写模板逻辑。

注意 null 和空字符串场景

formatted() 不处理 null 参数——传入 null 时,%s 会正常转为字符串 "null",但 %d%f 等会直接抛异常。建议提前校验:

  • 对可能为 null 的引用类型,可用 Objects.toString(obj, "N/A") 预处理
  • 数值类参数建议用包装类型判空,或使用 Optional 提供默认值
  • 空字符串("")本身合法,无需特殊处理

不适用于动态模板或复杂逻辑

如果模板本身来自配置文件、用户输入或数据库,不建议直接调用 formatted(),因为:

  • 无法在编译期发现占位符与参数不匹配的问题
  • 存在格式注入风险(如恶意传入 %n%01000000d 可能引发性能问题)
  • 此时仍推荐用 MessageFormat 或模板引擎(如 Thymeleaf、StringTemplate)
标签:Java

本文共计663个文字,预计阅读时间需要3分钟。

Java 15 中如何使用 String.formatted() 使字符串模板填充更简洁高效?

`String.formatted() 是 Java 15 引入的便捷方法,用于替代传统的 String.format()。该方法语法更简洁、可读性更强,且在编译期不做检查(运行时行为一致)。它直接作用于字符串字面量或变量,调用后返回填充后的结果字符串。

基本用法:替代 String.format() 的链式调用

以前写:

String result = String.format("Hello %s, you have %d new messages", name, count);

现在可写成:

String result = "Hello %s, you have %d new messages".formatted(name, count);

关键点:

立即学习“Java免费学习笔记(深入)”;

  • 调用者必须是字符串对象(不能是 null),否则抛 NullPointerException
  • 格式说明符(如 %s%d%.2f)与 String.format() 完全兼容
  • 参数个数和类型需匹配,不匹配会在运行时抛 IllegalFormatConversionExceptionMissingFormatArgumentException

配合常量字符串提升可维护性

把模板提取为 private static final 字符串,再调用 formatted(),既清晰又利于复用:

private static final String WELCOME_MSG = "Welcome, %s! Account balance: $%.2f";
...
String msg = WELCOME_MSG.formatted(username, balance);

相比拼接或硬编码格式,这种方式保留了类型安全提示(IDE 可校验占位符数量),也避免了重复书写模板逻辑。

注意 null 和空字符串场景

formatted() 不处理 null 参数——传入 null 时,%s 会正常转为字符串 "null",但 %d%f 等会直接抛异常。建议提前校验:

  • 对可能为 null 的引用类型,可用 Objects.toString(obj, "N/A") 预处理
  • 数值类参数建议用包装类型判空,或使用 Optional 提供默认值
  • 空字符串("")本身合法,无需特殊处理

不适用于动态模板或复杂逻辑

如果模板本身来自配置文件、用户输入或数据库,不建议直接调用 formatted(),因为:

  • 无法在编译期发现占位符与参数不匹配的问题
  • 存在格式注入风险(如恶意传入 %n%01000000d 可能引发性能问题)
  • 此时仍推荐用 MessageFormat 或模板引擎(如 Thymeleaf、StringTemplate)
标签:Java