静态导入Java实际上通过向导入包名添加一个static关键字,直接通过方法名使用。这样做的好处是不需要使用类名调用,也不需要建立一个新的对象来调用方法。静态导入只能在一定条件下进行,要求对象中的所有方法都是静态的。
事实上,在《有效的Java》一书中Joshua Bloch提到,Java开发人员应该只使用界面声明类型。我们不应该使用界面来声明常量界面,它们只用于导出常量界面。下面的Switchable常量接口提供了一个示例。
public interface Switchable
{
boolean OFF = false;
boolean ON = true;
}
开发人员可以使用常量接口,以避免在常量名称之前添加其引用类型的名称(例如Math.PI)。例如,下面代码中的Light类实现了Switchable接口,开发人员可以自由指定常量OFF,而不包括类前缀(如果在类中声明)。
public class Light implements Switchable
{
private boolean state = OFF;
public void printState()
{
System.out.printf("state = %s%n", (state == OFF) ? "OFF" : "ON");
}
public void toggle()
{
state = (state == OFF) ? ON : OFF;
}
}
在类实现中,常量接口提供常量。作为实现的详细信息,我们常量泄漏不应导出到类在API中,因为它们可以使用我们其他类别的类别感到困惑。此外,为了保持二进制的即使兼容我们不再使用它该类,也应致力于支持它们的发展。
为了满足常量接口的需要,避免使用它们带来的问题,Java 5引入静态导入。该语言功能可用于引入引用类型的静态成员。通过以下import 实现static语句:
import static packagespec . typename . ( staticmembername | * );
static将import放置在后面,将该句子与传统import句子区分开来。import语法类似于包和子包名称的标准句点分离列表中的传统句子。你可导入单个静态成员名称或所有静态成员名称。
import static java.lang.Math.*; // Import all static members from Math.
import static java.lang.Math.PI; // Import the PI static constant only.
import static java.lang.Math.cos; // Import the cos() static method only.
通过上面的例子,我们发现在导入它们之后,你在其类型名称之前,可以指定静态成员而不添加前缀,大大提高了代码的简洁度。例如,在指定第一个或第三个静态导入后,你可以直接指定cos,例如
double
cosine = cos(angle);
为了修复Switchable接口使其不再依赖implementsss Switchable,例如,我们可以插入静态导入下列代码所示。
改进了静态导入实现Switchable
package foo;
import static foo.Switchable.*;
public class Light
{
private boolean state = OFF;
public void printState()
{
System.out.printf("state = %s%n", (state == OFF) ? "OFF" : "ON");
}
public void toggle()
{
state = (state == OFF) ? ON : OFF;
}
}
该程序代码以一条package foo;语句开头,因为你静态成员不能从未命名的包中导入。该程序包的名称显示为后续静态导入的一部分:
import static
foo.Switchable.*;
在使用静态导入时,我们还注意以下两点:
首先,当两个静态导入同名成员时,编译器会报告错误。例如,假设包physics包含Math和java.lang的Math类是相同的类别,因为它实现了相同的PI常量和三角函数方法。编译器报告是错误的,因为它不确定是否java.lang.Math或physics.调用MathPI恒定正被访问和cos()方法:
import static java.lang.Math.cos;
import static physics.Math.cos;
double angle = PI;
System.out.println(cos(angle));
其次,过度使用静态导入会破坏所有静态成员的代码名称空间,使代码难以读取和维护。此外,任何阅读代码的人都可能很难找到静态成员来自哪种类型,特别是当所有静态成员的名称都从类型中导入时。
事实上,我们不难发现,java中的静态导入技术是一把双刃剑。使用良好可以大大提高代码的效率,无需使用类名或新对象。同时,错误的使用也会导致编译器报告错误。我们应该有一颗敬畏的心。我们可以在这个网站上学到更多关于静态导入的知识专业课程,让我们有能力使利刃归鞘。