Java中的Sprintf等效项
Printf在1.5版本中添加到Java中,但是我似乎找不到如何将输出发送到字符串而不是文件的方法(这是sprintf在C语言中的作用)。有谁知道如何做到这一点?
解决方案
回答
// Store the formatted string in 'result' String result = String.format("%4d", i * j); // Write the result to standard output System.out.println( result );
查看格式及其语法
回答
@erickson。
字符串是不可变的类型。我们不能修改它们,只能返回新的字符串实例。
因此," foo" .format()毫无意义,因为它必须像
string newString = "foo".format();
最初的Java作者(和.NET作者)认为,在这种情况下,静态方法更有意义,因为我们不是在修改" foo",而是调用format方法并传入输入字符串。
编辑:嘿,这个站点有时可能很有趣。我很讨厌提到字符串是不可变类型的事实。
这是一个为什么将Format()用作实例方法的例子。在.NET(可能还有Java)中,Replace()是一个实例方法。
你可以这样做:
"I Like Wine".Replace("Wine","Beer");
但是,什么也没有发生,因为字符串是不可变的。 Replace尝试返回一个新字符串,但未分配任何内容。
这会导致许多常见的新秀错误,例如:
// Contrived Example inputText.Replace(" ","%20");
同样,什么也没有发生,相反,我们必须做:
inputText = inputText.Replace(" ","%20");
现在,如果我们了解字符串是不可变的,那就很有意义了。如果我们不这样做,那么我们只会感到困惑。替换的正确位置是Format的位置,作为String的静态方法:
inputText = String.Replace(inputText," ", "%20");
现在毫无疑问发生了什么。
真正的问题是,这些框架的作者为什么决定一个应该是实例方法,而另一个应该是静态方法呢?在我看来,这两种方法都可以更好地表达为静态方法,但是Erickson似乎认为这两种方法都属于实例方法。
不管意见如何,事实是,使用静态版本时我们不太容易犯错误,并且代码更易于理解(没有隐藏的陷阱)。
当然,有些方法是完美的实例方法,例如String.Length()
int length = "123".Length();
在这种情况下,很明显,我们没有尝试修改" 123",我们只是对其进行检查,然后返回其长度...这是实例方法的理想之选。
我对不可变对象的实例方法的简单规则:
- 如果需要返回相同类型的新实例,请使用静态方法。
- 否则,请使用实例方法。