`
toshi2002
  • 浏览: 33641 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA1.5基础特性

阅读更多


语法改动比较大的是泛型编程。使用泛型编程需要在声明的时候提供附加的声明信息。比如:
List words = new ArrayList();
需要替换成:
List<String> words = new ArrayList<String>();
这样做的一个优点是,如果你插入数组的数据类型不是字符串的话,你就可以在编译的时候发现和解决这个bug。如果不使用上面的声明,这个bug不可能在编译的时候发现,程序运行后会出现ClassCastException 的错误。
另一个好处是:你不在需要担心集合中的元素超出了范围:
String title = ((String) words.get(i)).toUppercase();
使用:
String title = words.get(i).toUppercase();
你能简单的介绍一下这些J2SE 1.5中改变最大的六个方面吗?
好的,
一• 泛型编程 – 提供集合对象的编译时安全类型检查。
二• 增强 for 循环 - 编程更容易,去掉了修正了导致迭代出错的问题。
三• 装箱/拆箱 - 原始类型(int)和封装类型(Integer)的转换更容易。
四•  类型安全的枚举 – 提供了最常使用的类型安全的枚举模式。(Effective Java, Item 21)
五•  静态导入Static import - Lets you avoid qualifying static members with class names, without the shortcomings of the Constant Interface antipattern (Effective Java, Item 17).
• Metadata – 避免编写描述信息的代码,实现“声明”编程的模式。程序员声明需要做什么,然后由相关的工具来完成具体的工作。

一、泛型编程: 比如,过滤一个集合中的元素,现在的做法和j2se1.5中的做法有什么不同呢?
现在的做法是:
/**
* 从一个指定的集合中去掉一个4个字符的元素。
*/
static void expurgate(Collection c) {
for (Iterator i = c.iterator(); i.hasNext(); ) {
String s = (String) i.next();
if(s.length() == 4)
i.remove();
}}
上面的代码,有些缺陷,在运行的过程中可能出错。比如:在集合中如果包含一个StringBuffer类型的数据。
以后可以这样做:
static void expurgate(Collection<String> c) {
for (Iterator<String> i = c.iterator(); i.hasNext(); )
if (i.next().length() == 4)
i.remove();
}
二、增强的for循环!
一个集合中元素的迭代,原来的做法繁琐。J2SE1.5中大多数情况下你不需要使用Iterate 来遍历一个集合。增强的for循环,让编译器来完成具体的迭代工作。比如:
void cancelAll(Collection c) {
for (Iterator i = c.iterator(); i.hasNext(); ) {
TimerTask tt = (TimerTask) i.next();
tt.cancel();
}
}
现在可以这样做:
void cancelAll(Collection c) {
for (Object o : c)
((TimerTask)o).close();
}
注意:上面的冒号,它表示:in。在C#中或者很自然的一个替代是:foreach 和in 。但是考虑到兼容性,我们没有那样做。
泛型编程和增强的for结合后会是什么结果呢?
上面的例子中的代码,可以用下面的代码表示:
void cancelAll(Collection<TimerTask> c) {
for (TimerTask task : c)
task.cancel();
}
三、什么是装箱?
大家知道,java语言中有两种数据类型:一些是基本数据类型,另一些是对象引用类型。基本的数据类型无法直接放入到集合中,除非做相应的类型转换。这种转换非常枯燥。
举例:map数据类型的key用来存储单词,value用来存储单词重复的次数。这是一个计算单词出现频率的小程序。
public class Freq {
private static final Integer ONE = new Integer(1);
public static void main(String args[]) {
Map m = new TreeMap();
for (int i=0; i<args.length; i ) {
Integer freq = (Integer) m.get(args[i]);
m.put(args[i], (freq==null ? ONE :new Integer(freq.intValue() 1)));
}
System.out.println(m);
}
}
下面是采用装箱,泛型,和增强的for循环后的代码:
public class Freq {
public static void main(String args[]) {
Map<String, Integer> m = new TreeMap<String, Integer>();
for (String word : args)
m.put(word, m.get(word) 1);
System.out.println(m);
}
}
需要注意:上面的程序假定拆箱为null的时候,值为0。

J2SE1.5的新特点(下)
类型安全的枚举比以前的枚举有什么优点呢?
有如下特点:
• 提供编译时int枚举的安全检查,同时不再提供其他类型安全检查。
• 提供了枚举的命名空间
• 可以直接把它们放到集合中。
• 因为他们本质上是类,你可以向里面添加属性和方法。
上面的这些特点的确不错。能讲讲类型安全的枚举语言的特点和类型安全的枚举模式的关系吗?
一般来说:上面的那些特点简单的从语义上支持了模式。看下面的例子,和C/C++ 枚举的声明很相似:
enum Season { winter, spring, summer, fall }
声明虽然相似,但是确让编译器实现了上面提到的许多特性。你还可以把Season用到switch的判断语句中。
请举例说明“类型安全的枚举”的优点。
下面是一个表示美分枚举类型的例子。
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; }
}
这是个创举。我们定义了value来作为读取Coin的公共变量。在枚举的构造函数中可以在声明枚举实例的时候来初始化它。
让我们看看进一步使用这个枚举的例子。
我把不的呢。下面的程序打印一个表格和其中coin的大小和颜色。
public class CoinTest {
public static void main(String[] args) {
for (Coin c : Coin.VALUES)
System.out.println(c + ":   \t"
+ c.value() +"¢ \t" + color(c));
}
private enum CoinColor { copper, nickel, silver }
private static CoinColor color(Coin c) {
switch(c) {
case Coin.penny:   return CoinColor.copper;
case Coin.nickel: return CoinColor.nickel;
case Coin.dime:
case Coin.quarter: return CoinColor.silver;
default: throw new AssertionError("Unknown coin: " + c);
}
}
}
太棒了。那么静态引入static import 的功能对程序员有什么帮助呢?
首先他避免了程序员使用前缀的静态成员。以前常见的的一个替代的做法是:
// "Constant Interface" antipattern – 不推荐的做法
public interface Physics {
public static final double AVOGADROS_NUMBER   = 6.02214199e23;
public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
public static final double ELECTRON_MASS      = 9.10938188e-31;
}

public class Guacamole implements Physics {
public static void main(String[] args) {
double moles = ...;
double molecules = AVOGADROS_NUMBER * moles;
...
}
}
上面的做法达到了效果,可是却违背了一些设计原则。接口是用来定义方法和类型的,不是提供常量声明的。而且只是由Guacamole使用的常量也暴露给了使用其的客户端。
静态引入功能提供了一个简单的实现。这个功能和包的import功能类似。
import static org.iso.Physics.*;

class Guacamole {
public static void main(String[] args) {
double molecules = AVOGADROS_NUMBER * moles;
...
}
}
明白,那么什么是元数据类型metadata的功能呢?
使用metadata和第三方工具提供商可以让程序员自己的日子好过点。
以前许多发布API需要大量的描述信息。比如:定义一个JAX-RPC 网络服务API你需要提供其接口和实现类。如下:
public interface CoffeeOrderIF extends java.rmi.Remote {
public Coffee [] getPriceList()
throws java.rmi.RemoteException;
public String orderCoffee(String name, int quantity)
throws java.rmi.RemoteException;
}

public class CoffeeOrderImpl implements CoffeeOrderIF {
public Coffee [] getPriceList() {
...
}
public String orderCoffee(String name, int quantity) {
...
}
}
使用元数据功能,你可以节省大量的工作。你所需要做的是在代码上加上特殊的注释。你所使用的开发工具可是使用这些注释自动生成相关的代吗。如下所示:
import javax.xml.rpc.*;

public class CoffeeOrder {
@Remote public Coffee [] getPriceList() {
...
}
@Remote public String orderCoffee(String name, int quantity) {
...
}
}

分享到:
评论

相关推荐

    JAVA1.5安装包

    虽然NIO.2是在Java 7引入的,但Java 1.5的NIO(非阻塞I/O)已经是一个巨大的进步,为高性能网络编程提供了基础。 10. **枚举常量默认实现Comparable接口** Java 1.5中,所有枚举类型的实例默认实现了Comparable...

    java1.5API

    这个版本引入了许多创新特性,极大地提升了Java语言的功能性和效率,为后来的Java版本奠定了基础。在Java 1.5 API中,我们能看到以下关键知识点: 1. **泛型(Generics)**:泛型是Java 1.5最显著的改进之一。它...

    java1.5api

    Java 1.5 API,也被称为Java...Java 1.5 API的这些变化显著提升了开发效率,增强了类型安全性,减少了编译时和运行时的错误,同时也为后续的Java版本奠定了基础。学习和理解这些特性对于任何Java开发者来说都至关重要。

    JAVA API1.5中文帮助文档

    总的来说,Java API 1.5中文帮助文档是理解Java语言核心特性的宝贵资源,涵盖了泛型、枚举、注解、自动装箱/拆箱、并发处理和新的I/O模型等多个关键知识点。通过深入研究这份文档,开发者能够全面掌握Java 1.5的新...

    Java基础体验Java1.5中面向(AOP)编程.docx

    ### Java基础体验Java1.5中面向(AOP)编程 #### 概述 本文旨在探讨如何在Java 1.5中利用面向切面编程(Aspect-Oriented Programming, AOP)来改善应用程序的状态管理和日志记录。AOP是一种编程范式,通过将横切关注...

    Java-jdk1.5安装包

    Java JDK(Java Development Kit)是Java编程语言的开发环境,它是Oracle公司提供的用于编写、...泛型、枚举、注解等特性至今仍被广泛使用,是现代Java开发的基础。对于学习和理解Java编程,了解这些核心特性至关重要。

    java jdk1.5

    虽然Java 1.5并未正式引入依赖注入框架,但这一版本的注解功能为后续的构造器注入提供了基础。开发者可以通过构造函数传入依赖对象,实现依赖关系的解耦。 七、静态导入(Static Import) 静态导入允许开发者直接...

    java JDK1.5---32位和64位

    总的来说,Java JDK 1.5是Java发展历程中的一个重要里程碑,它的许多新特性至今仍被广泛使用,并且为后续版本的开发奠定了坚实的基础。对于学习和使用Java的开发者来说,了解和掌握这些特性至关重要。

    java学习(Jcreator+java1.5的帮助文档)

    "java学习(Jcreator+java1.5的帮助文档)"这个资源包正提供了这样的基础支持。 Jcreator是一款轻量级的Java集成开发环境(IDE),适合初学者和专业开发者使用。它提供了代码编辑、编译、调试和运行等功能,让编程...

    java jdk 1.5 API html

    以上是Java JDK 1.5中一些关键的新特性和改进,通过阅读和理解这个API HTML文档,开发者可以更好地掌握这些概念,提升编程技能,为编写高效、可靠的Java程序打下坚实基础。这份文档是每个Java开发者必备的学习资源。

    详细介绍JDK1.5的各种新特性

    **JDK1.5**,又称为Java Development Kit的第5个主要版本,标志着Java语言的一个...JDK1.5的发布不仅提升了开发效率,也为后续的Java版本奠定了坚实的基础。学习和理解这些新特性,对于任何Java开发者来说都至关重要。

    Java虚拟机1.5

    Java虚拟机1.5,也称为Java 5.0,是一个里程碑式的版本,它引入了许多重要的改进和新特性,旨在提高性能、可移植性和开发效率。以下是关于Java虚拟机1.5的一些关键知识点: 1. **泛型**:Java 5.0引入了泛型,允许...

    详细描述jdk1.5新特性

    Java 5.0(也称为 JDK 1.5)引入了一系列重要的新特性,这些特性极大地提高了开发者的编程效率和代码质量。其中最显著的特性之一便是泛型(Generics)。本文将详细介绍泛型的概念、使用方式以及它如何帮助开发者编写...

    JDK 1.5新特性

    【JDK 1.5新特性详解】 JDK 1.5是Java发展历程中的一个重要里程碑,引入了许多创新特性,极大地提升了开发效率和代码质量...JDK 1.5的这些更新奠定了后续版本许多新特性的基础,对于理解和使用现代Java编程至关重要。

    java1.5 annotation注释源代码

    Java 1.5 引入了一种新的元编程机制——注解(Annotation),极大地增强了代码的可读性和可维护性。注解是一种在代码中添加元数据的方式,它允许程序员在源代码上添加一些信息,这些信息可以被编译器或运行时环境...

    JavaJDK1.5中文简体API文档

    通过深入阅读和实践Java JDK 1.5中文简体API文档,开发者能够更好地掌握Java语言的精髓,提高开发效率,解决实际问题,并为后续学习更高级的Java技术打下坚实的基础。无论是日常开发、调试、优化还是面试准备,这个...

    JDK1.5版本,用于java开发

    JDK1.5,也被称为Java SE 5.0(Java Standard Edition 5.0),在Java的发展历程中是一个重要的里程碑,引入了许多创新特性和改进,极大地提升了开发效率和代码质量。以下是JDK1.5中的一些关键知识点: 1. **泛型...

Global site tag (gtag.js) - Google Analytics