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()*的存在是因为一些历史原因。我们分析了它们的差异,并根据我们的具体情况得出了最适合的选择。