Java5新特性

“JDK1.5/Java5”的一个重要主题就是通过新增一些特性来简化开发

这些特性包括泛型,for-each循环,自动装包/拆包,枚举,可变参数, 静态导入,注解

使用这些特性有助于我们编写更加清晰,精悍,安全的代码。

1.泛型(Generic)
C++通过模板技术可以指定集合的元素类型,而Java在1.5之前一直没有相对应的功能。一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。猛虎引入了泛型,它允许指定集合里元素的类型,这样你可以得到强类型在编译时刻进行类型检查的好处。

Collection<String> c = new ArrayList();
c.add(new Date());

  编译器会给出一个错误:

add(java.lang.String) in java.util.Collection<java.lang.String> cannot be applied to (java.util.Date)

2.For-Each循环
For-Each循环得加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:

void processAll(Collection c){ 
 for(Iterator i=c.iterator(); i.hasNext();){ 
    MyClass myObject = (MyClass)i.next(); 
    myObject.process(); 
 }

使用For-Each循环,我们可以把代码改写成:

 void processAll(Collection<MyClass> c){ 
  for (MyClass myObject :c){ 
      myObject.process(); 
  } 
}

这段代码要比上面清晰许多,并且避免了强制类型转换。

3.自动装包/拆包(Autoboxing/unboxing)
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.(Integer >> int)

在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。

int a = 3; 
Collection c = new ArrayList(); 
c.add(a);//自动转换成Integer.  
Integer b = new Integer(2); 
c.add(b + 2);

这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer.
4.枚举(Enums)
JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。

public enum Color
 {
   Red,
   White,
   Blue
 }

然后可以这样来使用

Color myColor = Color.Red.

枚举类型还提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如

for (Color c : Color.values())
    System.out.println(c);

5.可变参数(Varargs)
可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象,

util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);
…

在JDK1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了

public void write(Object... objs) {
    for (Object obj: objs)
    System.out.println(obj);
}

  在引入可变参数以后,Java的反射包也更加方便使用了。对于

c.getMethod("test", new
Object[0]).invoke(c.newInstance(), new
Object[0])),

现在我们可以这样写了

c.getMethod("test").invoke(c.newInstance()),

这样的代码比
原来清楚了很多。 
6.静态导入(Static Imports)
要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。

import static java.lang.Math.*;…….
r = sin(PI * 2); //无需再写r = Math.sin(Math.PI);

不过,过度使用这个特性也会一定程度上降低代码地可读性。

7.注解(Annotations)

注解(也被称为元数据):为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。
javaSE内置了3种标准注解:
@Override  表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误的提示。
@Deprecated  如果程序员使用了注解为它的元素,那么编译器会发出警告信息。
@SuppressWarnings  关闭不当的编译器警告信息。

注解应用:

在我们覆盖父类中的方法时,最好使用@Override注解,这样会避免出现一些未知错误,否则当你方法名称或者方法签名出现问题时,程序会将其处理为一个新的方法,而用了此注解以后,如果不小心出现了上述的错误,那么编译器将会给予提示,帮助我们正确的编码。
当我们使用了@Deprecated这一注解在我们所写的方法时,编译器将会发出警告,提示我们这个方法已经过时,样式为在方法的名称上出现横线。
@SuppressWarnings这个注解可以被理解成为压制警告,当我们忘记使用泛型时,编译器会给予警告,告诉我们还没有确定类型,这个时候我们不想制定具体的泛型类型,也不想让编译器给予警告,那么我们可以采用该注解来压制警告,这个注解可以作用在方法级别上也可以做用在类级别上。


下面是Oracle Java官方介绍:

Enhancements in JDK 5

  • Generics -
    This long-awaited enhancement to the type system allows a
    type or method to operate on objects of various types while providing
    compile-time type safety.  It adds compile-time type safety to the
    Collections Framework and eliminates the drudgery of casting.
    See the Generics Tutorial.
    (JSR 14)
  • Enhanced for Loop -
    This new language construct eliminates the drudgery
    and error-proneness of iterators and index variables when iterating over
    collections and arrays.
    (JSR 201)
  • Autoboxing/Unboxing -
    This facility eliminates the drudgery of manual
    conversion between primitive types (such as int) and wrapper types (such
    as Integer).
    (JSR 201)
  • Typesafe Enums -
    This flexible object-oriented enumerated type facility
    allows you to create enumerated types with arbitrary methods and
    fields.  It provides all the benefits of the Typesafe Enum pattern
    ("Effective Java," Item 21) without the verbosity and the error-proneness.
    (JSR 201)
  • Varargs -
    This facility eliminates the need for manually boxing up
    argument lists into an array when invoking methods that accept
    variable-length argument lists.
  • Static Import -
    This facility lets you avoid qualifying static members
    with class names without the shortcomings of the "Constant Interface
    antipattern."
    (JSR 201)
  • Annotations (Metadata) -
    This language feature lets you avoid writing boilerplate code
    under many circumstances by enabling tools to generate it from
    annotations in the source code. This leads to a "declarative"
    programming style where the programmer says what should be done and
    tools emit the code to do it.  Also it eliminates the need for
    maintaining "side files" that must be kept up to date with changes in
    source files.  Instead the information can be maintained in the
    source file. (JSR 175)
    NOTE: The @Deprecated annotation provides a way
     to deprecate program elements.
     See How and When To Deprecate APIs.

Generics papers

General papers

Enhancements in JDK v1.4

  • Assertion Facility -
    Assertions are boolean expressions that the programmer believes to be
    true concerning the state of a computer program. For example, after
    sorting a list, the programmer might assert that the list is in ascending
    order.  Evaluating assertions at runtime to confirm their validity is
    one of the most powerful tools for improving code quality, as it quickly
    uncovers the programmer‘s misconceptions concerning a program‘s behavior.

For More Information

时间: 2024-10-24 15:55:53

Java5新特性的相关文章

Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱

JDK1.5已经发布很长时间,之所以还拿出来是因为它增加了很多个重要的特性,使用这些特性有助于我们简化开发,编写的代码更加简洁清晰安全,主要有以下几个特性: ?  静态导入 ?  可变参数 ?  增强for循环 ?  自动拆装箱 ? 泛型 ? 枚举 由于泛型.枚举内容比较多,也最重要,之后单拿出来讲.这里先介绍前面四个简单而又实用的小特性. 1. 静态导入 所谓"静态导入"只不过是在普通的import语句中加入关键字static,例如: ?  非静态导入:import java.lan

java5 新特性

1.静态导入方法 Java代码   package com.java.new_features_jdk5; /** * * 一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*; * 这里的多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法.当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了. * 然后在这个类中,就可以直接用方

[Java5新特性]自动装箱/拆箱

自动装箱/拆箱概述 Java中具有基本类型(int,double,float,long,boolean,char,byte,short)和基本类型包装类(Integer,Double,Float,Long,Boolean,Char,Byte,Short),我们实现基本类型与包装类之间的转换基本有两种方式: 一种为JDK5之前的方式,比如Integer i = Integer.valueof(5);(这里5为基本类型int,Integer包装类利用valueof()方法将其转换为Integer类型

[Java5新特性]可变参数

什么是可变参数 Java基础内容中,关于函数具有一种特性:重载,如果我们要完成多个数字想加的需求,可以按照以下代码完成: public class Demo { public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } public static void main(String[] args) { int sum1 = new Demo().a

[Java5新特性]Annotation注解

Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包.类.构造器.方法.成员变量.参数和局部变量的声明,这些信息被存储在Annotation的"name=value"对中. Annotation能被用来为程序元素(类.方法.成员变量等)设置元数据,比如一段代码的作者或者告诉编译器禁止一些特殊的错误,不会影响代码的执行. 基本A

[Java5新特性]类加载器

类加载器概述 类加载器负责加载所有的类,系统为所有被载入内存中的类生成一个java.lang.Class实例.一旦一个类被加入JVM中,同一个类就不会被再次加入了.正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识.在Java中,一个类用其全限定类名(包括包名和类名)作为标识:但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识. 例如以下案例,在JVM中两个同名的Person类是完全不同的,之间也互不兼容,因为类加载器不同. 上述情况转换成代码如下: 定义一个Per

[Java5新特性]加强For循环

替换迭代器 我们先来回忆一下Java中的迭代器的用法,可以使用迭代器的有List和Set集合.原因在于它们都实现了Collection接口,而Collection接口拥有一个叫做Iterable父接口.下面我们来看一个案例: public class Demo { @Test public void demo() { List<String> list = new ArrayList<String>(); list.add("hello"); list.add(

[Java5新特性]泛型

Java中集合的问题 Java中的集合有个缺点:就是当我们把数据放置到集合中时,集合是不会记住数据类型的.也就是说,当我们再从集合中获取到数据时,数据类型都变成了Object类型了. 换句话讲,集合对元素类型是没有任何限制的.这样可能会出现一些问题,例如如果我们要创建一个专门存储字符串的List集合的话,也可以将Integer类型数据放置进入.即使放置进去的都是字符串数据,从List集合取出时,还是需要类型转换的(因为集合中元素类型都是Object类型). 例如下面这个例子:创建一个只保存字符串

[Java5新特性]枚举

什么是枚举类型 如果定义一个类来完成企业员工信息,员工信息包括姓名.年龄及职位等信息(职位只有WORKER.MANAGER及BOSS三个角色),具体完成代码如下: public class Demo { private String name; private Integer age; private String role; public String getRole() { return role; } public void setRole(String role) { this.role