赛迪网 > IT技术 Java > 技术动态
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

J2SE:综合J2SE(TM)5.0专题之语言特性 (4)

发布时间:2006.05.11 08:01     来源:赛迪网论坛    作者:


[可变长度参数]

 

顾名思义,可变长度参数就是指在方法的参数体中,只要定义恰当,我们可以使用任意
数量的参数,类似于使用数组。在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


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 基于AJAX技术的DataGrid控件编程 (05-10) · 用15分钟了解DaoZero:它为你实现DAO接口 (05-10)
· 新手必读:JAVA开发工具安装配置心得 (05-10) · 浅谈Java中final,finalized,finally (05-10)
· Java EE 5通过终审投票—JSR 224技术规范 (05-10) · 使用Java Annotations来管理对象的生命周期 (05-10)
· JavaOne即将召开 Sun将发布Java EE (05-10) · 【开发工具】Eclipse照亮Java众生 (05-09)
· Java基础:提升JSP应用程序七大绝招 (05-09) · 源码提供:数据库连接的一些代码 (05-09)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 北京新规不能霸王硬上弓 网店牌照缓期执行
· 软件外包之变的新台阶: 提高全球交付能力
· ERP案例分析 SaaS带来冲击 IT服务商面临挑战
· 通方期货CRM解决方案 房地产行业CRM解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统