Java中的Sprintf等效项

时间:2020-03-05 18:48:34  来源:igfitidea点击:

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",我们只是对其进行检查,然后返回其长度...这是实例方法的理想之选。

我对不可变对象的实例方法的简单规则:

  • 如果需要返回相同类型的新实例,请使用静态方法。
  • 否则,请使用实例方法。