使用 ThreeTen-Backport 和 java.time 时,是否应该完全限定包前缀?

Should you fully qualify the package prefix when using ThreeTen-Backport versus java.time?

提问人:ktm5124 提问时间:12/1/2018 最后编辑:Basil Bourquektm5124 更新时间:12/2/2018 访问量:188

问:

我们在项目中使用了 Three Ten Backport,因为我们的一个客户正在使用 Java 7。Three Ten Backport 为我们提供了 Java 8 中引入的新日期时间功能 (java.time.*)。

我想知道以下做法是否是一种好的做法。由于我们的大多数客户都在使用 Java 8,并且有一天我们可能会将所有客户升级到 Java 8,那么使用 org.threeten.bp 完全限定类名真的有意义吗?最终,我们可能会将所有客户都升级到 Java 8 并删除这种依赖关系,如果我们最终这样做,那么如果我们只使用不带包前缀的类名,那么代码更改就会减少。举个代码示例,我的意思是这个。

import org.threeten.bp.LocalDate Time;

public class Example {

     public void example() {
          LocalDateTime datetime = // ....
     } 
}

您可以在示例中看到,我引用了不带包前缀的 LocalDateTime。在 Java 8 中,会加载 java.time.LocalDateTime 类还是 org.threeten.bp.LocalDateTime?这有点不清楚,因为在这段代码中,在 Java 8 中,有两个 LocalDateTime 浮动,一个来自 java.time,另一个来自 org.threeten.bp。我假设本机 Java 库将被优先并加载,但我可能是错的。

这样做是好的做法吗?或者它会生成编译器警告/错误吗?即使它不会生成任何警告或错误,它仍然是一种不好的做法吗?我很想这样做,因为用包完全限定一个类是非常丑陋的,如果我们最终删除了 Three Ten 依赖项,那么我们将不得不更改该代码的每个实例,而不仅仅是删除 import 语句。很高兴听到你的想法。

Java java-8 三端

评论

6赞 JackPGreen 12/1/2018
如果您尚未导入 java.time 包,则不会使用其类。
2赞 MC Emperor 12/1/2018
我个人认为,他们使用相同类名的原因是,它使迁移到 Java 8 日期和时间 API 变得非常容易。它毕竟是一个向后移植,而不仅仅是一个库。我不会使用完全限定的类名,因为如果类具有相同的名称,它会破坏整个优势。我会改用简单的类名,当迁移到 Java 8 时,您只需替换导入即可。
3赞 MC Emperor 12/1/2018
此外,除了 @Jakg 的评论之外,仅自动导入包中的所有类。 ≠,您不必担心导入冲突或其他问题。java.langjava.timejava.lang
3赞 Basil Bourque 12/1/2018
您使用进口是明智的。无需完全限定类。ThreeTen-Backport 特意使用几乎相同的 API。要从 back-port 迁移到 java.time,您只需要搜索并替换这些语句即可。您必须手动替换的主要内容是对用于转换为旧类和现代类 (java.time*/*ThreeTen-Backport) 的实用程序类的调用。import

答:

5赞 Ousmane D. 12/1/2018 #1

只有当您同时拥有两个导入时才会发生冲突:

import org.threeten.bp.LocalDateTime;
import java.time.LocalDateTime;

只有 不应该导致问题。因此,您不需要完全限定任何语句import org.threeten.bp.LocalDateTime;LocalDateTime datetime = ...

评论

1赞 ktm5124 12/1/2018
哦,对了,呃。仅自动导入。谢谢!java.lang