当前位置: 首页 > 图灵资讯 > 技术篇> Java中的静态导入

Java中的静态导入

来源:图灵教育
时间:2023-04-02 17:43:20

静态导入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中的静态导入技术是一把双刃剑。使用良好可以大大提高代码的效率,无需使用类名或新对象。同时,错误的使用也会导致编译器报告错误。我们应该有一颗敬畏的心。我们可以在这个网站上学到更多关于静态导入的知识专业课程,让我们有能力使利刃归鞘。