论坛首页 Java企业应用论坛

Tiger in the house

浏览 13985 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-07-14  
很高兴花周五晚上2个小时的时间来阅读这样一本实用的书 -- 《Java 5.0 Tiger》

很多我面试过的朋友,工作经验两年以上,到今天都只用过JDK1.4,中WebSphere/WebLogic的毒不浅
智,日日知新也

一、新的类库
1, java.util.Arrays
提供对数组的一大堆实用的static方法:
binarySearch([], key):  使用二分搜索法来在指定数组中搜索指定值,返回搜索值的索引
toString([]): 打印数组内容
deepToString([]): 深层打印数组内容,适用于多维数组
equals([], []): 数组比较
deepEquals([], []): 深层比较,适用于多维数组
fill([], val): 给数组的每个元素赋值
sort([]): 对数组升序排序

2, java.util.Queue<E>
FIFO(先进先出)的必需品:
offer(E): 进
poll(): 出
Queue是接口,Queue q = new LinkedList();

3, java.util.Comparator<T>
结合java.util.Priority<E>构造自己排序的Queue:
compare(t1, t2): 实现自己的compare方法来排序

4, Override返回类型
Tiger让方法覆盖时连返回类型也可以Override:
public class Test1 {

  protected Test1 returnSomething() {
    return new Test1();
  }

}
public class Test2 extends Test1 {

  @Override
  protected Test2 returnSomething() {
    return new Test2();
  }

  public static void main(String... args) {
    System.out.println(new Test2().returnSomething().getClass().getName());
  }

}

Test2运行结果为: Test2
返回类型可以为superclass返回类型的extension

5, Unicode
Tiger前的Java版本支持Unicode 3.0,所有Unicode字符容于16位(一个char)
而Tiger改为支持Unicode4.0,它定义了不能容于16位的字符,这些字符不能容于一个char
这时我们用int类型的codePoint来表示该字符
codepoint是一个代表特定字符的数字,如0x3C0是π这个符号的codepoint
我们需要关注Character类的新方法

6, StringBuilder
不担心thread安全的情况下使用StringBuilder代替StringBuffer是最好的方式
引用

Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.
   发表时间:2007-07-14  
二、Generic
不光是类型安全,Parameterized Type作为参数和返回值,Generic是vararg、annotation、enumeration、collection等功能的基石
1, 类型安全
抛弃List、Map,使用List<String>、Map<Integer, String>
给List、Map添加元素或者使用Iterator<T>遍历时,编译期就可以给你检查出类型错误

2, 方法参数和返回值统统加上Type
抛弃List getStringListFromIntegerList(List list)
使用List<String> getgetStringListFromIntegerList(List<Integer> list)

3, 不再需要类型转换
List<String> l = new ArrayList<String>()
String s = l.get(i)

4, 类型通配符
假设一个打印List<T>中元素的方法printList,我们希望任何类型T的List<T>都可以被打印:
public void printList(List<?> list, PrintStream out) throws IOException {
  for (Iterator<?> i = list.iterator(); i.hasNext(); ) {
    out.println(i.next().toString());
  }
}

类型通配符"?"让我们的printList方法更通用

5, 限制类型参数
如果通配符?让我们的参数类型过于广泛,我们还可以限制一下它:
public void printList(List<? extends Number> list, PrintStream out) throws IOException {
  for (Iterator<? extends Number> i = list.iterator(); i.hasNext(); ) {
    out.println(i.next().toString());
  }
}


三、Enumerated类型
Tiger加入了枚举类型,而且是enum是类型安全的
枚举类型入门

四、Autoboxing与Unboxing
Primitive与Wrapper类型可以自动互转了
int、short、char与Integer、Short、Char一视同仁

五、vararg
变长参数让我们的方法更灵活更重用:
public Guitar(String... features)
public static void main(String... args)
0 请登录后投票
   发表时间:2007-07-14  
六、Annotation
Annotation是Java中的metadata

1, Tiger中预定义的三种标准annotation
a, Override
指出某个method覆盖了superclass的method
当你要覆盖的方法名拼写出错时编译不通过
b, Deprecated
指出某个method或element类型的使用是被阻止的
子类将不能覆盖该方法
c, SupressWarnings
关闭class、method、field/variable初始化的编译期警告
比如没有List没有使用Generic,则@SuppressWarnings("unchecked")将去掉编译期警告,这对将程序移植到JDK1.4有意义

2, 自定义annotation
public @interface Marked {}

3, meta-annotation
或者说annotation的annotation
四种标准的meta-annotation全部定义在java.lang.annotaion包中:
a, Target
指定所定义的annotation可以用在哪些程序单元上
如果Target没有指定,则表示该annotation可以使用在任意程序单元上
@Target({ElementType.ANNOTATION_TYPE,
         ElementType.CONSTRUCTOR,
         ElementType.FIELD,
         ElementType.LOCAL_VARIABLE,
         ElementType.METHOD,
         ElementType.PACKAGE,
         ElementType.PARAMETER,
         ElementType.TYPE})
public @interface TODO {}

b, Retention
指出Java编译期如何对待annotation
annotation可以被编译期丢掉,或者保留在编译过的class文件中
在annotation被保留时,它也指定是否会在JVM加载class时读取该annotation
@Retention(RetentionPolicy.SOURCE)  // Annotation会被编译期丢弃
public @interface TODO1 {}
@Retention(RetentionPolicy.CLASS)   // Annotation保留在class文件中,但会被JVM忽略
public @interface TODO2 {}
@Retention(RetentionPolicy.RUNTIME) // Annotation保留在class文件中且会被JVM读取
public @interface TODO3 {}

c, Documented
指出被定义的annotation被视为所熟悉的程序单元的公开API之一
被@Documented标注的annotation会在javadoc中显示,这在annotation对它标注的元素被客户端使用时有影响时起作用
d, Inherited
该meta-annotation应用于目标为class的annotation类型上,被此annotattion标注的class会自动继承父类的annotation

4, Annotation的反射
我们发现java.lang.Class有许多与Annotation的反射相关的方法,如getAnnotations、isAnnotationpresent
我们可以利用Annotation反射来做许多事情,比如自定义Annotation来做Model对象验证
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface RejectEmpty {
	/** hint title used in error message */
	String value() default "";
}

@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD, ElementType.METHOD })
public @interface AcceptInt {
	int min() default Integer.MIN_VALUE;
	int max() default Integer.MAX_VALUE;
	String hint() default "";
}

使用@RejectEmpty和@AcceptInt标注我们的Model的field,然后利用反射来做Model验证
0 请登录后投票
   发表时间:2007-07-14  
七、for/in
抛弃Iterator吧
for(int n : numbes) {
  println(n);
}

for(String s : stringList) {
  println(s);
}

自定义实现Iterable接口或继承现有Collection的类来让你的类可以使用for/in

八、静态Import
Tiger中静态方法也可以import了,enum元素也可以import
import static java.lang.System.out;
import static java.lang.Math.*;
import static xx.xx.xx.SomeEnum.*;


九、java.util.Formatter
让你拥有C的printf()风格的字符串格式化
formatter.format("Remaining account balance: $%.2f", balance);


十、线程
Tiger引进大量全新的并发性功能,更好的支持mutilthread

HashMap的替代者ConcurrentHashMap和ArrayList的替代者CopyOnWriteArrayList让我们用的放心、舒心、省心
在大并发量读取时采用java.util.concurrent包里的一些类会让大家满意

BlockingQueue、Callable、Executor、Semaphore...
0 请登录后投票
   发表时间:2007-07-14  
楼主写的rails系列很好阿,怎么又捡起tiger这条破船了?
有的东西确实还不错,例如concurrent部分,有的东西没有什么大用处,例如静态import(远不能达到在开发中提高生产力的效果)和for语法,还有些东西是看起来很美,实际上一用就麻烦不断。
例如范型,它鼓励的是一种严格类型化的开发模式,当初刚出来的时候还是很吸引我的,但是用一用就觉得确实有问题,关键是缺少runtime的类型,而且语法也很不方便,实际上是个鸡肋。
那个covariant return感觉虽好,但是似乎更多的意义在于把java完善了一下(印象中用tiger开发的时候压根就没有考虑这个地方)。
至于anotation,没怎么用过元编程的东西,倒是希望其他人谈谈。
0 请登录后投票
   发表时间:2007-07-14  
罪过啊罪过,我本将心照Tiger,无奈Tiger照沟渠
其实Tiger的Generic和Annotation算是为Java撑了点脸面了
0 请登录后投票
   发表时间:2007-07-15  
fsword 写道

有的东西确实还不错,例如concurrent部分,有的东西没有什么大用处,例如静态import(远不能达到在开发中提高生产力的效果)和for语法,还有些东西是看起来很美,实际上一用就麻烦不断。

EasyMock2,JUnit4中不用静态import写出的代码会丑陋无比,谁说不能提高生产力了
0 请登录后投票
   发表时间:2007-07-18  
现在写Tiger有点晚了,都准备换Java6了。
Annotation确实是Java语言的一大进步。另外,Generic 和for循环也能使Java代码简洁很多。Autoboxing与Unboxing用起来方便,但感觉不是很好,不小心容易出问题。
0 请登录后投票
   发表时间:2007-07-18  
Generic 我觉得就是个空壳子,类型擦除真是很不好的说。不过貌似这个是为了兼容原来的代码,才这样做的。

不过5里面最吸引人的就是线程部分的改动了。
0 请登录后投票
   发表时间:2007-07-20  
hideto看看Generic的背后会哭的……擦拭法造成的不一致。
还有Generic超级晦涩的语法……
经常被人用来攻击Java
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics