您好,登录后才能下订单哦!
这篇文章主要为大家展示了“JDK1.5中新的语言特征有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JDK1.5中新的语言特征有哪些”这篇文章吧。
在JDK1.5中新的语言特征,包括:
在JDK1.5中泛型(Generics)--为集合(collections)提供编译时类型安全,无需每刻从Collections取得一个对象就进行强制转换(cast)
在JDK1.5中增强的“for”循环(Enhanced For lOOp)--减少迭代器(iterator)的潜在错误(error-proneness)
在JDK1.5中自动置入/自动取出(Autoboxing/unboxing)--无需在基本类型(primitive types)(例如double)和包装类型(wrapper types)(例如Double)之间人工地进行转换。
在JDK1.5中类型安全的枚举(Typesafeenums)--提供类型安全枚举模式的各项好处。
在JDK1.5中静态导入(Static import)--无需在使用其他类的静态成员变量前缀其类名.这将使得代码更为简洁。
在JDK1.5中元数据(Metadata)--使编程人员避免编写样板化代码(boiler plate code),并提供机会进行宣告式程式设计(declarative programming)。
让我们详细讨论每个新特性,并看一些例子。
◆泛型(Generics)
泛型是JDK1.5中一个最“酷”的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。在JDK1.4中,创建雇员名字的清单(List)需要一个集合对象,像下面的语句:
List listOfEmployeeName = new ArrayList();
在JDK1.5中,你将使用下面语句
List<String> listOfEmployeeName = new ArrayList<String>();
最“酷”的是,如果你试图插入非string类型的值,你将在编译时发现并且修正这类问题。没有泛型,你会发现这样一个bug,当你的客户调用后会告诉你,你所编写的程序抛出ClassCastException异常而崩溃。
另外,当你从集合中得到一个元素时你无需进行强制转换。故原先为:
String employeeName = ((String) listOfEmployee.get(i));
而下面的语句将比上面的更加简单:
String employeeName = listOfEmployee.get(i);
不清楚对象的类型而强制转换对象是不合理的,并且更重要的是,它将在运行时失败。假使用户无意间传入一个包含string buffers类型而非string类型的集合,那结果会怎样呢。在Listing A中,客户被要求传入一个编译器无法强制的strings类型集合。Listing B中显示了同样的方法使用泛型是如何实现的。
Listing A
staticbOOleancheckName(Collection employeeNameList, String name) { for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) { String s = (String) i.next(); if(s.equals(name)){ return true; //print employee name here ...... } } return false; }
Listing B
staticbooleancheckName(Collection<String> employeeNameList, String name) { for (Iteratori = employeeNamList.iterator(); i.hasNext(); ) { if(i.next().equals(name)){ return true; //print employee name here ...... } } return false; }
现在,通过方法签名可以清楚知道输入集合必须只能包含strings。如果客户试图传入一个包含string buffers的集合,程序将不会编译。同时注意,该方法不包含任何强制转换。它只需要短短一行,一旦你习惯泛型后,它也更加清晰。
在jdk当前版本下的For循环语法如下:
void printAll(Collection c) { for (Iteratori = c.iterator(); i.hasNext(); ) { Employee emp = (Employee)i.next(); System.out.println(emp.getName()); } }
◆用增强的For语句实现相同方法:
voidprintAll(Collection c) { for (Object o : c) System.out.println((TimerTask)o).getName()); }
在这类For循环中,你应该将":"看成"in",所以,在该例中可以看成"for Object o in c"。你可以发现这种For循环更具可读性。
◆在JDK1.5中自动置入/自动取出(Autoboxing/unboxing)
Java有基本数据类型,在这些基本数据类型周围又有包装类。通常,编程人员需要将一种类型转换成另一种。看看Listing C.中的代码片断。
Listing C
public class Employee { private static final Integer CHILD = new Integer(0); public static void main(String args[]) { //code for adding n to an Integer int n=10; Integer age= new Integer(30); Integer ageAfterTenYear= new Integer(age.intValue +10); } }
请注意,用于计算ageAfterTenYear的内循环代码看上去是多么杂乱。现在,在Listing D.中看看相同的程序使用autoboxing重写后的样子。
Listing D
public class Employee { public static void main(String args[]) { int n=10; Integer age= new Integer(30); Integer ageageAfterTenYear= age +10; } }
有一件事值得注意的:在先前,如果你取出(unbox)Null值,它将变为0。在次代码中,编译器将自动地转换Integer为int然后加上10,接着将其转换回Integer.。
◆在JDK1.5中类型安全的枚举(Typesafeenums)
类型安全枚举提供下列特性:
他们提供编译时类型安全。
他们都是对象,因此你不需要将他们放入集合中。
他们作为一种类的实现,因此你可以添加一些方法。
他们为枚举类型提供了合适的命名空间。
他们打印的值具有情报性(informative)— 如果你打印一个整数枚举(intenum),你只是看见一个数字,它可能并不具有情报性。
例一:
enum Season { winter, spring, summer, fall }
例二:
public enum Coin { penny(1), nickel(5), dime(10), quarter(25); Coin(int value) { this.value = value; } private final int value; public int value() { return value; } }
◆在JDK1.5中静态导入(Static import)
静态导入使代码更易读。通常,你要使用定义在另一个类中的常量(constAnts),像这样:
importorg.yyy.pkg.Increment; class Employee { public Double calculateSalary(Double salary{ return salary + Increment.INCREMENT * salary; } }
当时使用静态导入,我们无需为常量名前缀类名就能使用这些常量,像这样:
import static org.yyy.pkg.Increment; class Employee { public Double calculateSalary(Double salary{ return salary + INCREMENT * salary; } }
注意,我们可以调用INCREMENT这一常量而不要使用类名Increment.。
◆元数据(Metadata)
元数据特征志于使开发者们借助厂商提供的工具可以进行更简易的开发。看一看Listing E.中的代码。
Listing E
importorg.yyy.hr; public interface EmployeeI extends java.rmi.Remote { public String getName() throwsjava.rmi.RemoteException; public String getLocation () throwsjava.rmi.RemoteException; } public class EmployeeImpl implements EmployeeI { public String getName(){ } public String getLocation (){ } }
通过元数据的支持,你可以改写Listing E中的代码为:
importorg.yyy.hr; public class Employee { @Remote public String getName() { ... } @Remote public public String getLocation() { ... } }
正像你所看到的,所有样板化的代码都不见了。
以上是“JDK1.5中新的语言特征有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。