“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
JSR14: Adding Generic Types to the Java Programming Language
- Generics Tutorial (PDF) Bracha
- Latest JSR14 draft specification
which includes an older prototype release of javac- Earlier public review
draft specification from Java Community Process- Making the Future Safe for the Past: Adding Genericity to the
Java Programming Language (PDF)
Bracha, Odersky, Stoutamire, and Wadler. OOPSLA 98, Vancouver,
October 1998.
(other formats)- GJ: Extending the Java Programming Language with Type Parameters (PDF)
Bracha, Odersky, Stoutamire, and Wadler. A tutorial on GJ. August 1998.
(other formats)- Adding Generics to the Java Programming Language (PDF)
Bracha. Slides from JavaOne 2003 presentation.- Adding Wildcards to the Java Programming Language (PDF)
Torgersen, Hansen, Ernst, Ahe, Bracha and Gafter. An ACM paper, 2004.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.