使用静态导入优于导入是否有任何优势?

Ruc*_*era 23 java import static-import

考虑以下课程

public final class Constant {
  public static final String USER_NAME="user1";
  //more constant here
}
Run Code Online (Sandbox Code Playgroud)

这个类在包B中.

现在我将在包A中使用它.考虑以下两种可以使用的方法.

方法1-使用 import B.Constant

import B.Constant;

public class ValidateUser {
public static void main(String[] args) {
   if(Constant.USER_NAME.equals("user1")){

   }
  }
 }
Run Code Online (Sandbox Code Playgroud)

方法2-使用 import static B.Constant.USER_NAME;

import static B.Constant.USER_NAME;

public class ValidateUser {
public static void main(String[] args) {
   if(USER_NAME.equals("user1")){

   }
 }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在这种情况下,静态导入是否有任何差异或优势?

Don*_*ows 30

normal import和a之间的唯一区别import static是后者用于将static某些其他类或接口的成员(尤其是常量)移动到范围内.你是否使用它取决于你; 我喜欢它,因为它让班级的身体更短,但是YMMV.

在编译成相同的字节码时,使用它们没有性能优势或惩罚(除了可能在编译时,就好像你关心它).

  • 我会走得更远。我建议首先不要*声明*非最终静态字段 (2认同)

Saj*_*ran 19

主要区别是Readablity,与之Constant.USER_NAME相比,可读性较差USER_NAME.

来自文档:

如果使用得当,静态导入可以通过删除重复类名的样板来使程序更具可读性.

但无论如何,尽量避免这样做

import static B.Constant.*;

因为它可以使用您导入的所有静态成员污染其命名空间.

  • 我认为`Constant.USER_NAME`更具可读性,当我在`ValidateUser`中只读'USER_NAME`时,我会立即认为有人已经错误地宣布了这个常数两次 (4认同)

Hus*_*man 9

我很少使用静态导入,只是在实际使代码更容易理解的地方.

根据oracle:

http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

那么什么时候应该使用静态导入?非常谨慎!只有在您试图声明常量的本地副本或滥用继承(Constant Interface Antipattern)时才使用它.换句话说,当您需要频繁访问来自一个或两个类的静态成员时,请使用它.如果过度使用静态导入功能,它可能会使您的程序无法读取且无法维护,并使用您导入的所有静态成员污染其命名空间.您的代码的读者(包括您,在您编写它几个月后)将不知道静态成员来自哪个类.从类中导入所有静态成员对可读性特别有害; 如果您只需要一个或两个成员,请单独导入它们.适当使用,静态导入可以使您的程序更具可读性,

这里需要注意的重点:

  • 当您需要频繁访问来自一个或两个类的静态成员时,请使用它
  • 如果使用得当,静态导入可以使您的程序更具可读性

评论者@Donal Fellows恰当地说,使用IDE来管理静态导入的风险较小.我同意现代IDE已经走过了漫长的道路,并将消除管理依赖性和追踪方法调用回到父母的许多痛苦.