1. 概述
在这篇文章中,我们将讨论*Paths.get()*
方法和*Path.of()*
方法之间的相似性和差异。
2. 相同的行为
*Path.of()*
方法接受一个*URI*作为参数,并将其转换为关联对象的Path。
现在让我们来看看*Paths.get()*
的代码:
public final class Paths {
public static Path get(URI uri) {
return Path.of(uri);
}
}
我们可以看到,*Paths.get()*
所做的唯一事情就是调用*Path.of()*
。因此,这两个方法返回的结果是相同的。
3. 方法之间的差异
接下来,我们来评论这两个方法的区别。
3.1. 引入版本
在Java 8之前,接口内定义默认静态方法是不可能的。因此,*Path*
需要一个伴生接口,即*Paths*
。当时,所有的工厂方法都定义在Paths
中。
然后,这个限制被移除,在Java 11中,工厂方法的代码最终被移到了*Path*
接口中。此外,*Paths.get()*
的代码也被更新为调用*Path.of()``。保留
Paths.get()`是为了确保向后兼容性。
3.2. 命名模式
代码不仅被移动,工厂方法的名称也发生了变化。原始名称的问题在于它看起来像一个getter。然而,*Paths.get()*
并没有从*Paths*
对象中获取任何东西。在Java中,静态工厂方法的标准名称是of
。例如,*[EnumSet.of()](/java-enumset)*
遵循此模式。因此,为了保持一致性,新的方法被命名为*Path.of()*
。
4. 我们应该使用哪个?
如果我们正在使用的Java版本在7到10之间,我们别无选择,只能使用*Paths.get()*
。否则,如果我们在较新版本的Java中工作,我们应该选择*Path.of()*
。实际上,*Paths*
类在未来可能会被弃用,这是类注释中提到的。此外,直接使用*Path*
接口的工厂方法可以省去额外的输入。
5. 总结
在这篇教程中,我们了解到两个相同的方法*Paths.get()*
和*Path.of()*
的存在是因为一些历史原因。我们分析了它们的差异,并根据我们的具体情况得出了最适合的选择。