【发布时间】:2009-04-27 04:43:19
【问题描述】:
我想知道为什么 Java 5 及更高版本使用 String 类中的静态方法提供了一个 printf 样式的格式化程序,如下所示:
public static String format(String format, Object... args)
而不是
public String format(Object... args)
这样我们就可以写"%02d".format(5) 来获得05 而不是String.format("%02d", 5)。
我想如果我可以修改 String 类,我可以添加这个:
public String format(Object... args) {
return format(this, args)
}
得到相同的结果。
我发现在C#中,也使用了静态方法而不是实例方法。
我想知道他们为什么决定这样做,但我没有做出解释。实例方法trim 和substring 返回一个新的字符串实例,所以它们应该对format 做同样的事情。
此外,DateFormat 类也使用这个:
public final String format(Date date)
用于格式化日期。因此,如果我们将 DateFormat 的实例视为格式化程序,则 String 的实例也可以用作格式化程序。
有什么想法吗?
【问题讨论】:
-
这并不重要,但我只是想知道这背后是否有任何理由。既然我们写的不是
String.substring("abcde", 3, 2)而是"abcde".substring(3, 2),我想format也应该有类似的调用方法。 -
同理,为什么是
Collections.sort(List),而不是List.sort()。我从来没有那么喜欢过。 -
我为此创建了一个错误报告。它被拒绝了,但它确实包含了一个解释。我去看看。我认为主要的一点是格式化注射器在语义上基本上与普通注射器不同。
-
这种小小的无聊每天都让我发疯。
-
在 Python (docs.python.org/2/library/stdtypes.html#str.format) 和 Ruby (ruby-doc.org/core-2.5.0/String.html#method-i-25) 中,它是非静态方法