为什么字符串的格式(对象...args) 定义为静态方法?

2022-09-01 15:59:19

我想知道为什么Java 5及更高版本在类String中使用静态方法提供printf样式的格式化程序,如下所示:

public static String format(String format, Object... args)

而不是

public String format(Object... args)

这样我们就可以写来代替 get。"%02d".format(5)05String.format("%02d", 5)

我想如果我可以修改 String 类,我可以添加以下内容:

public String format(Object... args) {
    return format(this, args)
}

以获得相同的结果。

我发现在C#中,还使用静态方法代替实例方法。

我想知道他们为什么决定这样做,但我没有做出解释。实例方法并返回 string 的新实例,因此它们应该对 执行相同的操作。trimsubstringformat

此外,该类还使用以下命令:DateFormat

public final String format(Date date)

用于设置日期格式。因此,如果我们将 DateFormat 的实例视为格式化程序,则 String 的实例也可以用作格式化程序。

有什么想法吗?


答案 1

也许似乎暗示调用该方法的对象是格式字符串。"%02d".format(5)format

在这种情况下,格式字符串恰好也是一个,所以进一步说明这一点,人们可以争辩说所有字符串都是格式字符串String

也许可以通过说类中的静态方法可用于格式化字符串来避免这种情况,而不是对一般情况下的所有s进行一些隐式语句。StringString


答案 2

虽然我不是Java的设计师,但我可以告诉你一个明确的理由,使它成为静态的。

Java 5带来了许多功能,但有两个值得注意的功能是:

  • 能够执行“导入静态”命令,这些命令允许从类中轻松使用静态方法,而无需列出其类名。
  • 一种静态实用程序方法,可以轻松执行 printfs。

虽然能够通过使方法保持静态来表示会很好,但您可以以一种非常熟悉和干净的方式使用格式,对于习惯了的C程序员来说。"bla: %d".format("foo"),printf()

import static java.lang.String.format;

public class Demo {

   public void Test() {

      //Do some stuff

      format("Hey, this is easy to read!");

   }
 }

这就是原因!通过使用静态导入,printfs 看起来几乎与它们在C中完全相同。