“JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发 ,这些特性包括泛型,for-each循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。
自动装包/拆包
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.(Integer >> int)
在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。
在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java语言为每一个内置数据类型提供了对应的包装类。
所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类Number的子类。
这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer.
Java代码
1.int a = 3;
2.Collection c = new ArrayList();
3.c.add(a);//自动转换成Integer.
4.
5.Integer b = new Integer(2);
6.c.add(b + 2);
枚举:
Java代码
1.public enum Color
2.{
3. Red,
4. White,
5. Blue
6.}
然后可以这样来使用Color myColor = Color.Red.
枚举类型还提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如
Java代码
1.for (Color c : Color.values())
2. System.out.println(c);
带构造函数的枚举:
Java代码
1.public enum Color {
2.
3. RED("红色"),BLUE("蓝色"),GREEN("绿色");
4.
5. private final String name;
6.
7. public String getName() {
8. return name;
9. }
10. private Color(String name){
11. this.name=name;
12. }
13.}
Java代码
1.System.out.println("Color.RED.name():"+Color.RED.name()); //RED
2.System.out.println("Color.RED.toString():"+Color.RED.toString()); //RED
3.System.out.println(Color.RED.getName()); //红色
Color.RED.name()
Color.RED.toString(); 得到的都是RED
1、Color枚举类是特殊的class,其枚举值(RED,BLUE...)是Color的类对象(类实例):Color c=Color.RED ;
而且这些枚举值都是public static final的,也就是我们经常所定义的常量,因此枚举类中的枚举值最好全部大写 。
2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同:
(1) 构造函数只是在构造枚举值的时候被调用。
(2) 枚举构造函数只能私有private ,绝对不允许有public构造器。这样可以保证外部代码无法新构造枚举类的实例。因为我们知道枚举值是public static final的常量而已 但枚举类的方法和数据域可以允许外部访问。
Java代码
1./**
2. *
3. * 服务器类型
4. *
5. */
6.public enum ServerType {
7.
8. JBoss("server/default/deploy","client,common"), WebLogic("",""), GlassFish("","");
9.
10. private String deployPath;
11.
12. private String libClassPath;
13.
14. private ServerType(String deployPath, String libClassPath){
15. this.deployPath = deployPath;
16. this.libClassPath = libClassPath;
17. }
18.
19. public String getDeployPath(){
20. return this.deployPath;
21. }
22.
23. public String getLibClassPath(){
24. return this.libClassPath;
25. }
26.}
ServerType serverType = ServerType.JBoss;
String deployPath = serverType.getDeployPath();
String libClassPath = serverType.getLibClassPath();
可变参数:
当不能确定一个方法的入口参数的个数时,以往版本的Java中,通常的做法是将多个参数放在一个数组或者对象集合中作为参数来传递,1.5版本以前的写法是:
Java代码
1.int sum(Integer[] numbers)
2.{
3. int nSum = 0;
4. for(int i: numbers)
5. nSum += i;
6. return nSum;
7.}
在别处调用该方法
sum(new Integer[] {12,13,20});
而在1.5版本中可以写为:
Java代码
1.public static int sum(Integer... number){
2. int nSum=0;
3. for(int i : number){
4. nSum+=i;
5. }
6. return nSum;
7.}
在别处调用该方法
Java代码
1.System.out.println("sum():"+sum(12,13,14));
2.System.out.println("sum():"+sum(12,13));
静态导入:
要使用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
不过,过度使用这个特性也会一定程度上降低代码地可读性。
Java代码
1.import static java.lang.Math.*;
2.…….
3.r = sin(PI * 2); //无需再写r = Math.sin(Math.PI);
|
|