1

根据Java 实践,通常应该避免使用静态导入。我明白了。但是,我想知道以下两种做法之间的区别是:

代码示例 #1

在第一个示例中,我静态导入SomeClass.someMethod,并在我自己的类的上下文中使用它,省略任何名称限定符。

import static package1.SomeClass.someMethod;
package package2;
public class MyClass {
    public void doSomething() {
        someMethod("Hello");
    }
}

代码示例 #2

在第二个示例中,我导入了类本身,然后将调用重定向到由其全名限定的方法。

import package1.SomeClass;
package package2;
public class MyClass {
    private void someMethod(String text) {
        SomeClass.someMethod(text);
    }
    public void doSomethind() {
        someMethod("Hello");
    }
}

两者的本质区别是什么?我的意思是除了代理调用会给我们带来的非常明显的优势(例如事件挂钩、参数监控等)。特别是,我想知道这方面是否有任何最佳实践,以及这是否有与性能相关的指南.

4

5 回答 5

3

两者的本质区别是什么?

除了代码可读性没有区别

在这里找到解释http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

那么什么时候应该使用静态导入呢?非常节俭!仅当您想要声明常量的本地副本或滥用继承(常量接口反模式)时才使用它。换句话说,当您需要频繁访问一个或两个类的静态成员时使用它。

关于代码可读性

如果你过度使用静态导入功能,它会使你的程序不可读和不可维护,你导入的所有静态成员都会污染它的命名空间。您的代码的读者(包括您,在您编写代码几个月后)将不知道静态成员来自哪个类。从一个类中导入所有的静态成员对可读性尤其有害;如果您只需要一两个成员,请单独导入它们。使用得当,静态导入可以通过删除类名重复的样板来使您的程序更具可读性。

于 2013-08-12T13:53:39.813 回答
1

通常应该避免使用静态导入

如果这是真的,那么该功能将永远不会添加到语言中。它添加较晚,这意味着该决定是基于多年的经验和数百万行代码。

问题不在于静态导入的特性,而在于静态成员的命名选择:

UserManager.instance

是错误命名选择的典型例子。不幸的是,它是遗留代码中的事实标准,而且许多现代代码也不适合静态导入。

UserManager.userManager

是为静态导入功能量身定制的名称示例。

我宁愿把这个问题颠倒过来,开始抨击那些阻碍他们的用户利用静态导入功能的图书馆制造商。

于 2013-08-12T13:52:00.837 回答
0

对你的问题

以下两种做法的区别是什么..

答案是,没有。这只是解决问题的两种方法。无论哪种方式都有效。一个可能比另一个更优选,但两者之间基本上没有区别。

于 2013-08-12T13:54:50.097 回答
0

这完全取决于个人喜好。

编译或执行时也没有显着的性能差异。

我总是使用非静态导入,因为有些人不知道静态导入的作用,他们会混淆它们。

于 2013-08-12T13:53:17.737 回答
0

两者的区别

两者没有区别,只是Code Sample #1节省了一些击键(参考第 2 点)并提高了可读性(此处适用的条件参考第 3 点)

static imports1.用来踢出Constant Interface Antipattern 。

2.使用static import,当您需要频繁访问一两个类的静态成员时。例如,如果您经常使用 System.out.println() 语句并尝试输入它,您可以static import System.out.

3.如果你过度使用这个static import特性,它会使你的程序不可读和不可维护,你导入的所有静态成员都会污染它的命名空间。

于 2013-08-12T14:19:04.607 回答