您的位置:首页 > Web前端

Java1.5 new feature --- Static Import 静态导入

2010-03-30 17:38 363 查看
Java语言中引入了导入静态数据,以简化静态属性和方法的使用。在导入静态信息后,就可以使用方法/属性,而不需要限制方法/属性到所属类名称。例如,通过导入Math类的静态成员,就可以编写abs或者sqrt,而不用写成Math.abs和Math.sqrt。
这种机制同时还阻止了一种危险的编码实践,即将一组静态属性放入一个接口中,然后在每个需要使用这些属性的类中实现该接口。为了能够使用不受限制的属性,不应该实现下面的接口:
interface ShapeNumbers {
public static int CIRCLE = 0;
public static int SQUARE = 1;
public static int TRIANGLE =
2;
}
实现这个接口会对ShapeNumbers接口产生不必要的依赖性。更糟糕的是,随着类的进化,特别是在其他类也需要访问这些常量,并且实现这个接口的情况下,对其进行维护会变得很困难。如果包含这些属性的接口进行了修改并且只有一些类被重新编译,那么已编译类相互之间很容易遇到同步问题。
为了更清楚地理解这点,将静态成员放入到一个类(而不是放入一个接口)中,然后通过一个已修改的导入指令语法导入。ShapeNumbers将修订如下:
package MyConstants;
class ShapeNumbers {
public static int CIRCLE = 0;
public static int SQUARE = 1;
public static int TRIANGLE =
2;
}
然后,一个客户端类从ShapeNumbers类中导入静态信息,接着就能够使用CIRCLE、SQUARE和TRIANGLE属性,而不需要为它们加上ShapeNumbers和成员操作符前缀。
为了导入类中的静态成员,请在Java源程序文件的导入部分(顶部)指定如下代码:
import static MyConstants.
ShapeNumbers.*; // imports all static data
这行语法只是根据标准的导入语句格式进行了稍许修改。关键字static添加在import关键字之后,因为静态信息正在从一个特定的类中被导入,所以现在不是导入包,而总是添加类名称。关键字static添加到导入语句的主要原因是为了清晰地向那些读源代码的人显示静态信息的导入。
也可通过以下语法单独导入常量:
import static
MyConstants.ShapeNumbers.CIRCLE;
import static MyConstants.
ShapeNumbers. SQUARE;
这种语法也是所希望的。关键字static被包含进来,因为这是一个静态导入,并且要导入的静态信息片段被各自分开显式指定。
不能从默认包的一个类中静态地导入数据。类必须位于一个指定的包中。同时,静态属性和方法可能会产生冲突。例如,下面是包含静态常量的两个类(分别位于Colors.java和Fruits.java中):
package MyConstants;
public class Colors {
public static int white = 0;
public static int black = 1;
public static int red = 2;
public static int blue = 3;
public static int green = 4;
public static int orange = 5;
public static int grey = 6;
}
package MyConstants;
public class Fruits {
public static int apple = 500;
public static int pear = 501;
public static int orange =
502;
public static int banana =
503;
public static int strawberry =
504;
}
如果编写一个类,试图同时对这两个类进行静态导入,在使用一个同时在上述两个类中定义的静态变量之前,一切进展都很正常:
import static MyConstants.
Colors.*;
import static MyConstants.
Fruits.*;
public class StaticTest {
public static void main(String
args[])
{
System.out.println("orange =
" + orange);
System.out.println("color
orange = " + Colors.orange);
System.out.println("Fruity
orange = " + Fruits.orange);
}
}
上述程序的第七行将导致如下编译器错误。由于标识符orange在Colors和Fruits中都定义了,因此编译器无法解决这种分歧:
StaticTest.java:7: reference to orange
is ambiguous, both variable orange in
MyConstants.Colors and variable orange
in MyConstants. Fruits match
System.out.println("orange =
" + orange);
在本例中,就应该使用定义静态数据的类来显式限制这种冲突名称。不是直接编写orange,而是编写Colors.orange或者Fruits.orange。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: