分享
 
 
 

JDK1.5中新的语言特征

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

本文中,我们将讨论几个在JDK1.5中新的语言特征,包括:

泛型(Generics)--为集合(collections)提供编译时类型安全,无需每刻从Collections取得一个对象就进行强制转换(cast)

增强的“for”循环(Enhanced For loop)--减少迭代器(iterator)的潜在错误(error-proneness)

自动置入/自动取出(Autoboxing/unboxing)--无需在基本类型(primitive types)(例如double)和包装类型(wrapper types)(例如Double)之间人工地进行转换。

类型安全的枚举(Typesafeenums)--提供类型安全枚举模式的各项好处。

静态导入(Static import)--无需在使用其他类的静态成员变量前缀其类名.这将使得代码更为简洁。

元数据(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循环更具可读性。

自动置入/自动取出(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 ageAfterTenYear= age +10;

}

}

有一件事值得注意的:在先前,如果你取出(unbox)Null值,它将变为0。在次代码中,编译器将自动地转换Integer为int然后加上10,接着将其转换回Integer.。

类型安全的枚举(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; }

}

静态导入(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中实现。它将提供Java编程社区更多的选择以编写鲁棒的、可扩展的代码。认真的Java编程人员将感到着手去熟悉这一Java编程语言的新版本是很有益的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有