此问题已在此处有答案:
What is a good use case for static import of methods?(16个回答)
4年前关闭。
考虑下面的类
public final class Constant {
public static final String USER_NAME="user1";
//more constant here
}
包B中的此类。
现在我将在包A中使用它。考虑以下两种可以使用的方法。
方法1-使用import B.Constant
import B.Constant;
public class ValidateUser {
public static void main(String[] args) {
if(Constant.USER_NAME.equals("user1")){
}
}
}
方法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")){
}
}
}
我的问题是,在这种情况下,正常导入与静态导入相比有什么区别或优势吗?
8条答案
按热度按时间4bbkushb1#
普通
import
和import static
之间的唯一区别是,后者用于将其他类或接口的static
成员- * 特别是 * 常量-移动到作用域中。用不用由你决定我喜欢它,因为它保持类的身体较短,但YMMV。使用它们不会带来性能上的好处或损失(除非是在编译时,好像您很关心这一点),因为它们编译成相同的字节码。
pu3pd22g2#
主要区别是可读性,
Constant.USER_NAME
与USER_NAME
相比可读性较差。Documentation:
如果使用得当,静态导入可以通过删除类名重复的样板文件,使程序更具可读性。
但无论如何,尽量避免做
import static B.Constant.*;
因为它可能会用您导入的所有静态成员污染其命名空间。
ttvkxqim3#
我很少使用静态导入,只有在它们实际上使代码更容易理解的情况下才使用。
Oracle表示:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html
那么什么时候应该使用静态导入呢?非常谨慎!只有当您试图声明常量的本地副本或滥用继承时才使用它(常量接口反模式)。换句话说,当您需要频繁访问一个或两个类中的静态成员时,请使用它。如果您过度使用静态导入特性,它会使您的程序不可读且不可维护,并使您导入的所有静态成员污染其命名空间。你的代码的读者(包括你,在你写了代码几个月后)将不知道静态成员来自哪个类。从一个类中导入所有的静态成员对可读性特别有害;如果只需要一个或两个成员,请分别导入它们。如果使用得当,静态导入可以通过删除类名重复的样板文件,使程序更具可读性。
这里要注意的要点:
评论者@Donal Fellows恰当地说,使用IDE来管理静态导入的风险较小。我同意现代IDE已经走过了很长的路,并且将消除很多管理依赖关系和跟踪方法调用到父对象的痛苦。
qcuzuvrc4#
例如,Math类中的所有方法都是静态的,我们将它们都称为Math.mathod()。但是如果我们像这样导入math类:
import static java.lang.Math.*;
我们不必在方法前添加Math:goqiplq25#
静态导入可以避免使用类名限定静态成员。
一旦导入了静态成员,就可以在代码中使用它,而不需要类名前缀。
很好的例子:
mnemlml86#
静态导入用于保存您的时间和输入。如果你讨厌一遍又一遍地输入同样的东西,那么你可能会发现这样的导入很有趣。
import允许java程序员访问一个包的类,而不需要包限定。
静态导入**特性允许访问类的静态成员,而无需类限定。
让我们通过下面的例子来理解这一点:
示例1:无静态导入
输出:
示例2:使用静态导入
输出:
pokxtpni7#
**各位,今天我们遇到了静态导入的一个很大的缺点。下面分享一下吧~~~
1.从XXXZeloImpl.java扩展的AbstractService.java需要EVENT_ID =“eventId”。所以EVENT_ID =“eventId”在AbstractService.java中声明。
1.现在#1被破坏,因为www.example.com中的EVENT_ID引用XXXComceteImpl.java了www.example.com中的EVENT_IDAbstractService.java
1.可能是EVENT_ID =“eventId”的命名应该不同。
1.注意:-类的名称是编辑版本,所以看起来不寻常。
nqwrtyyt8#
为了访问静态成员,必须用引用所来自的类来限定引用。例如,必须说:
您可能希望避免不必要地使用静态类成员(如Math.com)。和系统。为此,请使用静态导入。例如,当使用静态导入更改上述代码时,将其更改为:
那么使用上述技术的好处是什么呢?我看到的唯一优点是代码的可读性。而不是写静态类的名称,可以直接写方法或成员变量的名称。这里也要记住一件事。不允许不明确的静态导入。也就是说,如果你已经导入了java.lang.Math.PI,而你想导入mypackage.Someclass.PI,编译器会抛出一个错误。因此,只能导入一个成员PI。