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

时间:2010-01-14 19:56:55

标签: java coding-style

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

1

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

2

import java.awt.*;

10 个答案:

答案 0 :(得分:39)

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

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

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

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

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

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

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

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

答案 1 :(得分:26)

单独使用导入。

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

虽然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;

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

我知道这个问题不是关于绩效问题,而是cost of import statements关于javaperformancetuning.com月份问题的完整总结,为什么你应该避免使用通配符:

  

(...)   最后,很多人发现使用   用通配符导入   来源的可读性要低得多   读者还需要弄清楚哪个   包特定类来自,   而不只是在它看起来   进口声明。

     

所以完整的答案是

     
      
  • 使用导入语句没有运行时成本
  •   
  • 编译过程可能会花费更多时间进行导入   声明
  •   
  • 使用通配符导入时,编译过程可能会花费更多时间   声明
  •   
  • 为了提高可读性,通配符导入语句是不好的做法   除了一次性课程
  •   
  • 非通配符导入语句的编译开销是   轻微,但他们提供可读性   好处所以最好的做法是使用   它们
  •   

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

答案 5 :(得分:0)

这里没有正确答案。

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

无论您的团队的IDE是什么默认值。这样你就可以在提交之前自己编写文件的自动形式。

答案 9 :(得分:-1)

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