[可变长度参数]
顾名思义,可变长度参数就是指在方法的参数体中,只要定义恰当,我们可以使用任意 数量的参数,类似于使用数组。在J2SE(TM) 5.0中,一个新的语法被引入,就是在参数 类型名称后面加上"...",表示该方法可以接受多个该类型的参数。需要说明的是可变长 度参数必须放在参数列表的最后,且一个方法只能包含一个这样的参数。在方法体内 部,这样的参数被当作数组处理,看上去代码应该类似这个样子:
public String testVararg(String... args) {
StringBuilder sb = new StringBuilder();
for (String str : args) {
sb.append(str);
}
return sb.toString();
}
这样的方法签名跟你写成testVararg(String[] args)的区别在于:在调用时,你不再需 要传入一个包装好的String数组,你只需要简单的写一连串String参数,以逗号隔开即 可,就如同这个方法正好有一个重载的版本是接受那么多个String参数一样。
[静态引入]
所谓静态引入就是指除了引入类之外,我们现在又多了一种选择:引入某个类的静态字 段。如:
import static java.lang.Math.PI;
或者
import static java.lang.Math.*;
这样我们在接下来的代码中,当我们需要使用某个被引入的静态字段时,就不用再写上 前面的类名了。当然,出现名字冲突时,跟原来的类引入一样,还是需要前缀以示区 分。我个人认为这个新语言元素意义不大。当引入太多静态字段后,代码会变得难以阅 读和维护。由于静态字段的名字通常不如类名那么具有描述性,我认为原先在静态字段 前写上类名才是更好的选择。不过,毕竟每个人的喜好和需求不同,如果你觉得它对你 有用,既然提供了,那么就用咯。
[元数据(注解)]
注解是J2SE(TM) 5.0引入的重要语言元素,它所对应的JSR是JSR 175,我们先来看看 JSR 175的文档对注解的说明:
注解不会直接影响程序的语义,而开发和部署工具则可以读取这些注解信息,并作相应 处理,如生成额外的Java源代码、XML文档、或者其他将与包含注解的程序一起使用的物 件。
在之前的J2SE版本中,我们已经使用到了一部分早期的注解元素,如@deprecated等。这 些元素通常被用于产生HTML的Javadoc。在J2SE(TM) 5.0中,注解被正式引入,且推到了 Java历史上前所未有的高度。
现在,注解不仅仅被用来产生Javadoc,更重要的,注解使得代码的编译期检查更加有效 和方便,同时也增强了代码的描述能力。有一些注解是随着J2SE(TM) 5.0一起发布的, 我们可以直接使用。除此之外,我们也可以很方便的实现自定义的注解。在此基础上, 很多以前我们只能靠反射机制来完成的功能也变得更加容易实现。
我们来看现成的有哪些有用的注解:
首先是@Override,这个注解被使用在方法上,表明这个方法是从其父类继承下来的,这 样的写法可以很方便的避免我们在重写继承下来的方法时,不至于不小心写错了方法签 名,且悄悄的溜过了编译器,造成隐蔽性相当高的bug。
其次是@Deprecated,表明该项(类、字段、方法)不再被推荐使用。
还有一个@SuppressWarnings,表明该项(类、字段、方法)所涵盖的范围不需要显示所 有的警告信息。这个注解需要提供参数,如unchecked等等。
下面我通过一个例子向大家说明这些现成的注解的用法:
public class Main {
@Deprecated
public String str;
public static void main(String[] args) {
new SubMain().doSomething();
}
public void doSomething() {
System.out.println("Done.");
}
}
class SubMain extends Main {
@Override
@SuppressWarnings("unchecked", "warning")
public void doSomething() {
java.util.ArrayList aList = new java.util.ArrayList();
aList.add(new Integer(0));
System.out.println("Done by SubMain.");
}
}
当然,我们也完全可以写自己的注解。注解定义的语法是@interface关键字。J2SE(TM) 5.0支持三种形式的注解:不带参数的标记注解、带一个参数的注解和带多个参数的完整 注解。下面分别举例说明:
标记注解,类似@Deprecated,如:
@interface SomeEmptyAnnotation {}
单个参数的注解,如:
@interface MySingleElementAnnotation {
String value();
}
以及多个参数的注解,如:
@interface MyAnnotationForMethods {
int index();
String info();
String developer() default "Sean GAO";
}
我们可以看到,注解的定义跟interface的定义相当类似,我们还可以指定默认值。对于 这些注解,我们也可以为其添加注解,所谓“注解的注解”。比方讲,我们通常会使用 @Target指定注解的作用对象,以及用@Retention指定注解信息写入的级别,如源代码、 类文件等等。举个例子:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface SignedMethod {
}
在使用时,我们需要在注解名称前面写上@,然后()中指定参数值,如:
@MyAnnotationForMethods (
index = 1,
info = "This is a method to test MyAnnotation.",
developer = "Somebody else"
)
public void testMethod1() {
// ...
}
注解的最大作用在于它在源代码的基础上增加了有用的信息,使得源代码的描述性更 强。这些信息可以被代码之外的工具识别,从而可以很方便的增加外部功能,以及减少 不必要的相关代码/文件维护。这里我想简单提一个超出J2SE(TM) 5.0范畴的话题:在未 来的EJB 3.0规范中会有相当多的对注解的应用,让我们预览一下将来的无状态会话bean 用注解来定义会是什么样子:
@Stateless public class BookShelfManagerBean {
public void addBook(Book aBook) {
// business logic goes here...
}
public Collection getAllBooks() {
// business logic goes here...
}
// ...
}
我们甚至不用写任何接口和部署描述符,这些工作将完全由外部工具通过读取注解加上 反射来完成,这不是很好吗?
[C风格格式化输出]
Java总算也有类似C的printf()风格的方法了,方法名同样叫作printf(),这一特性依赖 于前边提到的可变长度参数。举个例子来说,我们现在可以写:
System.out.printf("%s has a value of %d.%n", someString, a);
怎么样,看上去还不错吧?需要注意的是Java为了支持多平台,新增了%n标示符,作为 对\n的补充。有关Java格式化输出的具体语法,请参考java.util.Formatter的API文 档。
<<上一页
1
2
3
4
|