在Java中列出导入的正确方式是什么?

列出您将需要的每个单独的包装(参见#1)是否更好?或者从包装中导入所有内容(参见#2)会更好吗?

1

import java.awt.image.ColorModel; import java.awt.image.ComponentColorModel; import java.awt.image.ColorConvertOp; 

2

 import java.awt.*; 

这不仅仅是一种风格问题; 按需导入可能导致代码在新类添加到现有包时停止编译。

基本想法(有关详细信息,请参阅http://javadude.com/articles/importondemandisevil.html 。):

 import java.awt.*; import java.util.*; ... List list; 

在Java 1.1中工作; 从Java 1.2开始,上面的代码将不再编译。

按需导入是EVIL,因为当新类添加到现有包时,您的程序可以停止编译!

总是使用显式导入。 这不是风格问题; 这是一个安全问题。

如果您检查完美编译代码并且一年后有人检查它并尝试使用新类库编译它,这尤其糟糕。

(按需导入是一个非常糟糕的编程语言function的例子 – 当新类型添加到系统时,没有任何function可以破坏代码!)

单独使用导入。

生产代码列出要导入的每个类都要好得多。

虽然IDE在帮助您了解正在使用哪些类方面做得很好,但知道您所指的是更具可读性:

 java.util.List; 

并不是

 java.awt.List; 

等等。

此外,建议您按照第3方传递的核心库并以自己的项目库结束的方式将它们分组:

  import java.util.List; import java.util.ArrayList; import java.util.Date; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.event.TableModelListener; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.cookie.CookieSpec; import your.own.packagename.here.SomeClass; import your.own.packagename.here.OtherClass; 

对于小型自我项目/类,可以使用通配符。 它更快,但预计不可维护。 如果涉及任何其他开发人员,请使用第一个。

如果单独列出它们,当使用简单的编辑器(而不是从开发环境中)读取代码时,更容易检测到哪些包对象来自。 从复杂项目中读取代码时,可以节省大量时间。 事实上,当我从一个大型开源项目研究代码而不想将所有内容加载到eclipse时,就是今天早些时候的一个例子。

后者通常被认为是“糟糕的forms”。 有了工具支持,没有理由不单独列出它们,它消除了任何歧义。

请注意,默认情况下,Eclipse使用通配符进行静态导入,使用显式导入进行常规导入。 不确定为什么它会做出这种区分。

编辑:后见之明的区别很明显 – 静态导入通常引用静态方法,并且您不能明确地按名称引用静态方法(由于重载)。 因此,如果它不能完全明确,您也可以使用通配符。

我知道这个问题不是关于性能,而是javaperformancetuning.com上月份的import语句成本问题完美地总结了为什么你应该避免使用通配符:

(…)最后,许多人发现使用带有通配符的导入会使源的可读性降低,因为读者还需要确定特定类来自哪个包,而不是仅仅在import语句中查找它。

完整的答案是

  • 使用import语句没有运行时成本
  • 使用import语句,编译过程可能需要更多时间
  • 使用通配符import语句,编译过程可能需要更多时间
  • 为了提高可读性,通配符导入语句对于除了一次性类之外的任何东西都是不好的做法
  • 非通配符导入语句的编译开销很小,但它们提供了可读性优势,因此最佳实践是使用它们

使用wilcard import语句一种不好的做法,它们使代码的可读性降低,只是不这样做。 此规则的唯一例外是静态导入,例如import static org.junit.Assert.*; 。 不,我不想单独导入每个assertXXX ,但我发现这不会损害代码的可读性。

这里没有一个正确的答案。

带给你Eclipse的人投票支持个人导入,因为Source / Organize Imports会将*表单转换为特定表单。

如果您使用像visual studio这样的ide,它通常会为您解决这个问题,所以您甚至不需要考虑它。

我所知道的大多数IDE选择上面的选项1。 这与我过去使用的一些代码分析工具(如checkstyle)一致,因为他们认为使用*符号是不好的做法。

您列出的选项1是首选,但如果您从java.awt.image中导入更多类,那么最好只有一个导入java.awt.image。*大多数IDE允许您指定数字的确切数量要使用的import产品。 例如,在IDEA中,我们可以使用File->Settings->Code Style->imports在常规选项卡中,有一个字段Class count to use import with * ,默认值为5。

无论你的团队的IDE是什么默认值。 这样你就可以在提交文件之前自己做一个autoformat。

单独导入,它使编译器不必查看每个类的每个包,因此可以更快地运行。