Ran*_*ku' 24 java string format printf
我想知道为什么Java 5及以上版本在String类中使用静态方法提供了printf样式的格式化程序,如下所示:
public static String format(String format, Object... args)
Run Code Online (Sandbox Code Playgroud)
代替
public String format(Object... args)
Run Code Online (Sandbox Code Playgroud)
这样我们就可以写出"%02d".format(5)
让05
代替String.format("%02d", 5)
.
我想如果我可以修改String类,我可以添加:
public String format(Object... args) {
return format(this, args)
}
Run Code Online (Sandbox Code Playgroud)
得到相同的结果.
我发现在C#中,还使用静态方法而不是实例方法.
我想知道为什么他们决定这样做,但我没有得到解释.实例方法trim
并substring
返回一个新的string实例,所以他们应该做同样的事情format
.
此外,该DateFormat
课程还使用了这个:
public final String format(Date date)
Run Code Online (Sandbox Code Playgroud)
用于格式化日期.因此,如果我们将DateFormat的实例视为格式化程序,则String的实例也可以用作格式化程序.
有任何想法吗?
coo*_*ird 11
也许"%02d".format(5)
似乎暗示format
调用该方法的对象是格式字符串.
在这种情况下,格式字符串恰好也是一个String
,因此可以进一步说明所有String
s都是格式字符串.
可以通过说类中的静态方法String
可以用来格式化字符串,而不是String
通常对所有s 进行一些隐式声明来避免这种情况.
虽然我不是Java的设计师,但我可以告诉你一个明确的理由让它变得静态.
Java 5出现了许多功能,但有两个注意事项:
虽然能够"bla: %d".format("foo"),
通过使方法静态来说很好,但你可以使用格式,这种方式对C程序员来说非常熟悉和干净printf()
.
import static java.lang.String.format;
public class Demo {
public void Test() {
//Do some stuff
format("Hey, this is easy to read!");
}
}
Run Code Online (Sandbox Code Playgroud)
这就是原因!通过使用静态导入,printfs看起来几乎就像在C中一样.太棒了!
主要原因可能是Java的设计者不想在String的接口上添加太多东西.使它成为一个成员函数意味着将它放在字符串上.请记住,非静态方法必须在String对象上.
第二个原因是静态格式与C的printf保持相似,它看起来像printf(FORMAT,ARG1,ARG2 ......)
另一个原因是格式重载:有一个版本将locale作为第一个参数(在字符串之前),因此在字符串对象上执行此操作会很棘手.