Java MessageFormat 是否有像 String.format 那样的平台行分隔符?

Does Java MessageFormat have a platform lineseparator like String.format does?

这是一个远景,但我希望像

一样替换 MessageFormat 代码中的换行文字
LOG.log(INFO, "message={0}\nAnd extra blank line\n", new String[]{message});

具有独立于平台的模式。 String.format() 模式 %n 不适用于 Logger 或 MessageFormat。我想避免像这样将 System.lineseperator 作为参数传递:

LOG.log(INFO, "message={0}{1}And a blank line{1}",new String[]{message, System.lineSeparator()});

我在 MessageFormat 的文档中没有看到任何关于换行符或行分隔符的提及,但也许在其他地方提到过。 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/MessageFormat.html

Does Java MessageFormat have a platform lineseparator like String.format does?

根据我对代码的阅读,答案是否定的

我在 Java 或 OpenJDK Bug 跟踪器1.

中没有看到任何现存的 RFE 或 Bug 报告。

但是,正如 Joop 指出的那样,由于您实际上是在日志记录的上下文中提出这个问题,因此还有一些其他方法可以解决这个问题(尽管并非所有方法都实用):

  • 忽略这个问题。这些消息将进入日志文件。也许日志文件中消息中的行分隔符并不总是与平台匹配并不重要。
  • 创建 MessageFormat 的自定义子类,该子类识别表示“平台特定的行分隔符”的语法。
  • 通过在自定义日志消息附加程序或格式化程序中转换它们来处理行分隔符;例如
    • 翻译 所有 种“错误类型”的行分隔符。
    • 识别并翻译一个神奇的字符序列...
  • 更改为使用 java.util.Formatter 构建消息的不同日志记录框架。据我所知,大多数现代框架都可以。
  • 提交 RFE。

1 - 您可以将其解读为 MessageFormat 在现实世界/现代应用程序中很少使用的“证据”,或者很少有人在行分隔符的上下文中使用它事.


@Bohemian 评论:

Why do you want to avoid "passing System.lineseparator as an argument"?

我还以为是 self-evident。它很笨重。