为什么String的格式(Object ... args)被定义为静态方法?

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#中,还使用静态方法而不是实例方法.

我想知道为什么他们决定这样做,但我没有得到解释.实例方法trimsubstring返回一个新的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,因此可以进一步说明所有Strings都是格式字符串.

可以通过说类中的静态方法String可以用来格式化字符串,而不是String通常对所有s 进行一些隐式声明来避免这种情况.


Bra*_*ugh 7

虽然我不是Java的设计师,但我可以告诉你一个明确的理由让它变得静态.

Java 5出现了许多功能,但有两个注意事项:

  • 能够执行"导入静态"命令,允许在类中轻松地使用静态方法,而无需列出其类名.
  • 一种静态实用程序方法,可以轻松执行printfs.

虽然能够"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中一样.太棒了!


Uri*_*Uri 5

主要原因可能是Java的设计者不想在String的接口上添加太多东西.使它成为一个成员函数意味着将它放在字符串上.请记住,非静态方法必须在String对象上.

第二个原因是静态格式与C的printf保持相似,它看起来像printf(FORMAT,ARG1,ARG2 ......)

另一个原因是格式重载:有一个版本将locale作为第一个参数(在字符串之前),因此在字符串对象上执行此操作会很棘手.