Java 中的 Sprintf 等效项
2022-08-31 05:08:10
Printf在1.5版本中被添加到Java中,但我似乎找不到如何将输出发送到字符串而不是文件(这就是sprintf在C中所做的)。有人知道如何做到这一点吗?
Printf在1.5版本中被添加到Java中,但我似乎找不到如何将输出发送到字符串而不是文件(这就是sprintf在C中所做的)。有人知道如何做到这一点吗?
字符串是不可变的类型。您无法修改它们,只能返回新的字符串实例。
因此,使用实例方法进行格式化没有多大意义,因为它必须像这样调用:
String formatted = "%s: %s".format(key, value);
原始 Java 作者(和 .NET 作者)认为静态方法在这种情况下更有意义,因为您不是在修改目标,而是调用格式方法并传入输入字符串。
下面是一个示例,说明为什么作为实例方法会很愚蠢。在.NET中(可能在Java中),是一个实例方法。format()
Replace()
您可以执行以下操作:
"I Like Wine".Replace("Wine","Beer");
但是,没有任何反应,因为字符串是不可变的。 尝试返回新字符串,但未将其赋值给任何内容。Replace()
这会导致许多常见的新手错误,例如:
inputText.Replace(" ", "%20");
同样,什么也没发生,相反,你必须做:
inputText = inputText.Replace(" ","%20");
现在,如果您了解字符串是不可变的,那么这非常有意义。如果你不这样做,那么你只是感到困惑。正确的位置是 where is,作为以下的静态方法:Replace()
format()
String
inputText = String.Replace(inputText, " ", "%20");
现在毫无疑问发生了什么。
真正的问题是,为什么这些框架的作者决定一个应该是实例方法,而另一个是静态的?在我看来,两者都更优雅地表达为静态方法。
不管你的观点如何,事实是你使用静态版本不容易犯错误,代码更容易理解(No Hidden Gotchas)。
当然,有一些方法可以完美地作为实例方法,取 String.Length()
int length = "123".Length();
在这种情况下,很明显我们不是试图修改“123”,我们只是检查它,并返回它的长度。这是实例方法的完美候选者。
我对不可变对象上的实例方法的简单规则: