JDK-8203630 [“为String :: format添加等效的实例方法”]假定“将String :: format实现为静态的参数似乎是可以静态导入 format方法,因此其行为与C的sprintf比较 。” 在有关该主题的StackOverflow.com线程上 , Brandon Yarbrough写道:“通过使该方法静态化,您可以使用格式,这对于习惯于printf()
C程序员来说是非常熟悉和简洁的。” Yarbrough提供了一个代码示例,然后得出结论:“通过使用静态导入,printf看起来几乎就像它们在C中一样。太棒了!”
当我在JDK-8203630中阅读有关此内容的内容时,我想知道为什么我在使用它时没有静态导入String.format ,因为现在看来这样做很明显。 在本文中,我将简要介绍一些我考虑过的个人理论,以解释为什么我(以及许多其他人)并未考虑一致地静态导入String.format
。
当J2SE 5引入静态导入时, 有关该功能的新文档提出了一个问题:“那么什么时候应该使用静态导入?” 它以强调的方式回答了自己的问题(我没有加粗体 ),“ 非常谨慎! ”然后,该段继续提供了更多有关静态进口的适当和不当使用以及过度使用静态进口的负面影响的详细信息。
尽管原始文档着重警告过度使用静态导入,但是随着开发人员逐渐习惯了静态导入,它们的使用确实在逐渐增加。 2012年,我通过博客文章问道:“ Java越来越接受静态导入吗?” 那时,我感到它们越来越被接受,尤其是在单元测试环境中以及在专注于提供“ 流利 ” API的更现代的库和框架中使用它们时 。 仍然以某种方式,我不认为始终将静态导入应用于我的String.format
使用。
我不经常使用String.format
,所以我认为也许我只是没有太多机会考虑这一点。 但是,即使我使用的次数相对较少,我也不记得曾经静态地导入过它。 当我进一步考虑这个问题时,我意识到我可能不考虑静态导入String.format
的主要原因与大多数开发人员没有考虑的原因相同:大多数流行且易于使用的在线方法如何使用String.format
示例请勿使用静态导入!
在撰写涵盖某功能的博客或文章时,尤其是在入门级别时,不要进行静态导入之类的操作会很有用,因为显式拼写出类名可以提高开发人员理解方法中的位置的能力。代码来自。 但是,这也意味着,如果给定的开发人员阅读了大量文章和帖子,并且其中没有一个显示使用静态导入,则该开发人员很容易使用所有这些示例中所示的API,而无需考虑静态导入的可能性。
以下是有关使用String.format
一些介绍性文章。 在撰写本文时,他们还没有通过静态导入演示String.format
使用。 我要强调指出,这并没有脱离这些资源的质量; 如果有的话,其中的一些很棒。 相反,这是用作解释为什么String.format
似乎很少静态地以Java代码静态导入的证据。
- 适用于java.util.Formatter的JDK 10 Javadoc声明“类似于C的
sprintf(3)
,可以使用静态方法String.format
格式化字符串”,然后使用String.format
提供代码示例,而不是静态导入。 - Baeldung的详细“ java.util.Formatter指南 ”提供了许多代码清单,这些清单证明了
String.format
使用,但是没有一个是静态导入的。 - DZone详细的文章“ Java字符串格式示例 ”演示了如何使用
String.format
而不进行静态导入。 - “ Java字符串格式示例 ”一文中的“ Java Code Geeks示例 ”以使用
String.format
而不静态导入的示例结尾。 - 最近发布的“ 使用String.format方法进行Java String格式化(如'sprintf') ”提供了有用的讨论和示例,但并未讨论静态导入
String.format
。 - GeeksForGeeks的“ 带示例的Java String format() ”提供了
String.format
使用的多个示例,但是没有一个是静态导入的。 - “ Java字符串格式示例 ”提供了不使用静态导入而应用
String.format
多个示例。 - “ 用示例解释的Java String format()方法 ”不会在其多个示例中静态导入
String.format
。 - StackOverflow.com线程“如何用Java格式化字符串”中提供的示例不会静态导入
String.format
。 - “ Java String format()方法 ”的
String.format()
的多个示例不会静态导入它。
以上文章中的许多示例都使用String.format()
生成分配给局部变量的String
。 在这种情况下,可以说静态导入的价值要小于在更大的代码行中使用它格式化String
的价值。 例如,静态导入String.format()
更为“流利”,这样,当在一行代码中进行格式化时,只需指定format()
即可完成其他操作,而不仅仅是将格式化后的字符串分配给局部变量。
这篇博文的主要目的是指出/提醒我们可以静态导入String.format
从而使我们的代码更具可读性。 但是,在关于该主题的OpenJDK core-libs-dev邮件列表的简短讨论中 ,还有其他一些有趣的观点,我将在这里简要指出:
- JDK-8203630通过以下示例指出了在某些情况下实例方法如何使代码更具可读性:
"This result is %d".format(result);
- RémiForax指出了一些反对在
String
中添加实例format
方法的参数 :- 与
static
方法和实例方法相关联的问题在类中共享相同的名称。
- 与
无论实例 format
方法是否出现在Java的String
,有关JDK-8203444 , JDK-8203630以及相关邮件列表讨论的内容 ,为我提供了一些思考的机会。 如果没有其他问题,在考虑使用String.format
时,我绝对会更倾向于权衡其性能,而在使用它时,将更有可能静态导入它。
翻译自: https://www.javacodegeeks.com/2018/05/javas-string-format-can-be-statically-imported.html