2005/06/04 | JDK1.5新特性介绍
类别(编程相关) | 评论(0) | 阅读(274) | 发表于 20:15
整理] 簡介 Java 5 新增的功能


--------------------------------------------------------------------------------
Java 5 新功能簡介 ...
為什麼要貼這個?因為鑑於網路上做這方面整理的繁體中文不多,除了米小國良葛格的網站之外,其他的可能散見於 javaworld@tw(我沒仔細搜尋),所以貼一下,以後可能會納入小的個人的網站上 ...
還有要說明一下,以下是整理自網路、書上地內容,非本人獨創


◆ 自動裝箱/拆箱(Auto-Boxing∕Auto-Unboxing)
  自動裝箱:基本類型自動轉為包裹型態(Wrapper Types),例如 int 轉為 Integer
  自動拆箱:包裹型態自動轉為基本類型,例如 Integer 轉為 int

[範例]
int a = 10;
Collection c = new ArrayList();
c.add(a);  // 自動轉換成 Integer,在JDK1.5之前,集合不能存放基本類型

Integer b = new Integer(5);
c.add(b - 100);  // Integer 先自動轉換為 int 進行加法運算,然後 int 再次轉換為 Integer

[範例]
Long myLongObj = 5L ;   // Auto-Boxing
long myLong = myLongObj ;  //Auto-Unboxing

[範例]
Boolean b1 = true;
Boolean b2 = false;
boolean b3 = false;
Boolean result = (b1 || b2) && b3;


◆ 增強式的 for 迴圈(For-Each)
語法
for (Type Identifier : Expression) Statement
 Expression 須為 array 或是 java.lang.Iterable 該介面的 instance
這是傳統 for 迴圏的增強與簡便寫法,功能和 for 一樣

[範例]
void cancelAll(Collection c) {
  for (Iterator i = c.iterator(); i.hasNext(); ) {
    TimerTask tt = (TimerTask) i.next();
    tt.cancel();
  }
}
利用 enhanced for 可改寫成
void cancelAll(Collection c) {
  for (Object o : c)
    ((TimerTask)o).cancel();
}
或將 generics 和 enhanced for 合用
void cancelAll(Collection c) {
  for (TimerTask task : c)
    task.cancel();
}


◆ 列舉型態 Enum
1. 使用關鍵字 enum 定義列舉型態
2. 列舉型態預設繼承自 java.lang.Enum 類別,enum type(列舉子)預設為 static、final、public。
 列舉子的值其實是它本身的名稱。
3. 列舉內可定義 enum types、methods、constructors、fields。
 constructors 不能為 public。
4. 編譯器會將列舉轉成類別,但列舉本身不具備類別的某些功能,例如繼承。

[範例]
public enum Color {
  Red, Green, Blue
}
......
Color myColor = Color.Red.

[範例]
enum Coin {
  penny(1), nickel(5), dime(10), quarter(25); // enum type
  Coin(int value) { this.value = value; } // constructor
  private final int value; // field
  public int value() { return value; } // method
}
public class CoinTest {
  public static void main(String[] args) {
    for (Coin c : Coin.values())
      System.out.println(c ": \t" c.value() " \t" color(c));
  } //Main
  private enum CoinColor { copper, nickel, silver }
  private static CoinColor color(Coin c) {
   switch(c) {
    case penny : return CoinColor.copper;
    case nickel : return CoinColor.nickel;
    case dime :
    case quarter : return CoinColor.silver;
    default : throw new AssertionError("Unknown coin: " c);
  } //switch
} //CoinColor
} //CoinTest
執行結果:
penny:   1   copper
nickel:   5   nickel
dime:   10   silver
quarter:  25   silver

[範例]
enum Fruit {
  ORANGE("orange"), APPLE("red"), PEAR("green"); // 會呼叫建構子 Fruit(String c)
  String color;
  Fruit(String c) {
    color = c;
  }
  public String getColor() { return color; }
}
......
public static void printList(){
  for(Fruit f : EnumSet.allOf(Fruit.class)) {
    System.out.print(f); // 印出「ORANGEAPPLEPEAR」
  }
}


◆ 可變參數個數∕不固定參數個數 (Varargs)
1. Methods 使用 ... 點號可宣告為支援接受可變數目的引數。可變參數必須放在參數列的最後面。
2. Methods 中最多只能有 1 個不固定參數的宣告,不能有 2 個或 2 個以上的不固定參數。

[範例]
public void myVarargs(int x, Object... myObjs) {
  ...
}

[範例]
void varArgTest(Object ... args) {
  for (int i=0; i <args.length; i ) {
    ......
  }
}
varArgTest("str1", "str2");

[註] parameter--參數,argument--引數

◆ 靜態導入(Static Imports)
1. 靜態導入可導入類別內的所有 static fields 和 static methods,亦即使用這些 static members 無需再指定其類別名稱。
2. 使用 * 星號字元可導入類別內所有的靜態成員

[範例]
import static java.lang.Math.*;
.....
r = sin(PI * 2); // // 等於 r = Math.sin(Math.PI);


◆ 輸出格式化(Formatted Output)∕輸入強化(Enhanced Input)
1. System.out.printf(...) 方法可作簡單的輸出格式設定
2. java.util.Scanner 類別可取得使用者的輸入
  取得輸入的依據是空白字元,舉凡按下空白鍵、tab鍵或是enter鍵,Scanner就會傳回下一個輸入


[範例]
Java 1.5 之前的版本要從 keyboard 讀入 integer 值的作法
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int n = Integer.parseInt(str);
Java 1.5 的版本可改寫成
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();

[範例]
Scanner s= new Scanner(System.in);
String myParam= s.next();
int myvalue = s.nextInt();
s.close();

[範例]
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());   // 1
System.out.println(s.nextInt());   // 2
System.out.println(s.next());    // red
System.out.println(s.next());   // blue
s.close();

[範例]
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input);
s.findInLine("(\\d ) fish (\\d ) fish (\\w ) fish (\\w )");
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i )
  System.out.println(result.group(i));
s.close();

[範例]
System.out.printf("name count%n");
System.out.printf("%s ]%n", user,total);

[註] Java 1.4
Object[] arguments = { new Integer(7), new java.util.Date(), "a disturbance in the Force" };
String result = java.text.MessageFormat.format(
  "At {1,time} on {1,date}, there was {2} on planet "
    "{0,number,integer}.", arguments);
// At 下午 09:53:19 on 2005/4/6, there was a disturbance in the Force on planet 7

[ Last edited by jocosn on 2005-4-8 at 09:14 PM ]
◆ Metadata(data about data) --Program Annotation Facility (程式註解工具)
也就是 annotations,以下簡稱為註文,或和 annotations 混用以作說明 。
相關套件 java.lang.annotation

1. Metadata can be used to create documentation, to track down dependencies in code, and even to perform rudimentary compile-time checking
2. annotations 可用在 package declarations、type declarations、constructors、methods、fields、parameters、和 variables 上。
3. 使用 metadata 的好處:documentation(也就是 javaDoc 產生的說明文件可將 metadata 包進去 )、compiler checking、code analysis

註文並不影響程式碼的語義,但卻影響用於處理包含有注釋的程序代碼的工具的處理方式,使他們(工具)能夠影響運行狀態的程序的語義。
註文可以從原始碼中讀取,從編譯後的 .class 文件中讀取,也可以通過 reflection 機制在執行時讀取。

Annotations 的使用:
&#8231; Java 5 內建的 annotations(built-in annotations)
1. @Override annotation
 A) 指明該 method 覆寫(override)基底類別的 method。
 B) 只能用在 methods (不能用在 classes、package declarations、constructs)。
 C) 可和 method 放置在同一列,也可以分列。
 D) 為 marker annotation。

2. @Deprecated
 A) 指明 method 不應該繼續使用。
 B) @Deprecated 可和 method 放置在同一列,也可以分列。
 C) 為 marker annotation

3. @SuppressWarnings
 A) single-annotation
 B) 可關掉 classes、methods、fields、或 variable initializers.. 等的 compiler warnings,但是實際上我測試結果好像無作用?

[範例]
public class OverrideAnnotationClass {
  @Override   // 指明 override 繼承自基底類別 java.lang.Object 的 methods
  public String toString() {
    return super.toString() " [Override Implementation]";
  }
}

[範例]
public class DeprecatedAnnotationClass {
 @Deprecated public void doSomething() {
   // ......
 }
 public void doSomethingNewVersion() {
   // This method presumably does what doSomething() does, but better
 }
}

[範例]
class MyAT2 {
 @SuppressWarnings("unchecked")  // 經測試結果,這句有加沒加好像都一樣?
 public void nonGenericsMethod() {
  java.util.List myList = new java.util.ArrayList();   // no typing information on the List
  myList.add("Hello");   // causes error on list addition
}


&#8231;自定註文
使用步驟
[步驟一] 定義註文型態(annotation type)
1. annotation type 的宣告類似 interface 的宣告,使用 "@" 記號後接 interface 關鍵字和中括號 "{ }",中括號內的 members 可以是 methods、enums、variables、或 inner classes/interfaces 等。
2. 註文中的 members
 A) method 宣告
  (1) method declaration 用來定義 annotation type 的 element。
  (2) method declaration 不能有任何的參數或 throws 子句。
  (3) return type 只能限定為 primitives、String、class、enums、annotations、或這些型別的陣列。
  (4) method 可以有預設值(default values),使用關鍵字 default 設定。
  (5) method 存取權限不能為 protected、或 private。
 B) enums(或稱 enumeration)
   enums 的預設存取權限為 public。
   enums 可用來作為 annotation type 的預設值。  
4. annotation type 內沒有任何的 elements 稱為 marker annotation type。
 marker annotation 在使用的時候,其後面的小括號(parenthes)可以省略。
5. 用來對 annotation type 做註文的 annotations 稱為 meta-annotations。
 meta-annotation 的種類:
 A) @Target   --定義在 java.lang.annotation.Target
  此種 meta-annotation 使用在 java.lang.annotation.ElementType 列舉中定義的 constants,以 "@Target" 指明 annotation type 適用之處,如只用於 fields、或 constructors 等 。
 B) @Retention   --定義在 java.lang.annotation.Retention
  使用在 java.lang.annotation.RetentionPolicy 列舉中定義的 constants,以 " "@Retention" 告知編譯器如何處理 annotation,處理方式有:
  1) RetentionPolicy.RUNTIME  --編譯過的 class 檔案內會保留 annotations,並在 class 載入時讀取註文。
  2) RetentionPolicy.CLASS  --編譯過的 class 檔案內會保留 annotations,但在 runtime 時會忽略註文,為預設行為。
  3) RetentionPolicy.SOURCE  --編譯過後的 class 檔案會移除 annotations。
 C) @Documented  --定義在 java.lang.annotation.Documented
  屬於 marker annotations,表示 annotation 應出現在 Javadoc 中。預設情況下,annotations 不會寫入 Javadoc 檔案內。
  須配合 @Retention 指明 RetentionPolicy.RUNTIME 兩者一起使用。
 D) @Inherited  --定義在 java.lang.annotation.Inherited
  設定基底類別內的 annotation type 會被衍生類別自動繼承。預設值為不繼承。
  當 annotated type 使用在類別上時,設定 @Inherited 才有作用;
  且 @Inherited 的作用只及於類別被繼承,若為介面的實作則無作用。
  不過實際上試驗結果好像不是這樣!

[範例] 定義 annotation type
public @interface MyAT {
 int myid();
 String myname() default "[unassigned]";
 String mybirthday() default "[unimplemented]";
}

[範例] meta-annotations
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test { }

[範例] meta-annotations
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation { }

[步驟2] 使用註文(annotation)
1. annotation 是一種特別形式的 modifier,可用在一般 modifiers(如 public、static、或 final)能用的地方。
2. annotations 應放在一般 modifiers 的前面。
3. annotations 的組成:
 由 "@" 符號,後面加上 annotation type 名稱和小括號 "( )" 組成,括號內為成對的 "element=value",以 "=" 等號指派 element 的值為 value,多組 "element-value" 以 "," 逗號間隔,其中 values 必須是常數(compile-time constants)。
 要傳遞多組的 value 給 element,須使用陣列的方式。
4. 如果註文型態僅包含一個元素,且該元素的名字為 value 時,則在使用此種注文型態時候,元素的名字和等號可以省略;若元素名稱不是 value,則不能省略。

[範例]
@interface MyAT1 {
  String myAuthor() ;
  String myDate() ;
}
public class MyClass {
  @MyAT1( myAuthor = "Ken", myDate = "4/1/1964")
  public static void MyMethod( ) { ... }
  // ......
}

[範例]
public @interface MyMarkerAT { }  // Marker Aannotation Type
@MyMarkerAT public class MyClass {  // 省略 marker annotations 後的小括號
  ...
}

[範例]
@interface Copyright { String value(); }

@Copyright("2002 Moon Macrosystems, Inc")
public class MyClass { ... }

--------------------------------------------------------------------------------
◆ 泛型(Generics)
尚在整理。不知道有沒有完整的說明?

5/5 更新。整理後貼在這,因為實在是太長了。
www.javaworld.com.tw/jute ... amp;tpg=1&age=0

◆ concurrency
J2SE 1.5 新增 java.util.concurrent 套件(package),提供 concurrency utilities,功能包括 thread pools、queues、concurrent collection、special purpose locks、和 barriers。

java.sun.com/developer/technicalArticles/J2SE/concurrency/

A First Look at JSR 166: Concurrency Utilities
today.java.net/pub/a/today/2004/03/01/jsr166.html

Advanced Synchronization in Java Threads, Part 1
www.onjava.com/pub/a/onja ... ds3_ch6/index1.html

[ Last edited by jocosn on 2005-5-5 at 07:54 PM ]
◆ 泛型(Generics) :
java.sun.com/features/2003/05/bloch_qa.html
我是看這裡的QA 雖然不夠完整,但透過討論應當會越來越清楚

Generics - Provides compile-time type safety for collections and eliminates the drudgery of casting.

既然它的作用時間是在 compile-time
那麼便可以避免掉部份的資料來源問題
今天我們寫 java 的程式,常常需要用到某個產品的某個API
當你的API 提供給妳某個 method 叫做 expurgate , return ㄧ個 Collection 物件
你就必須要對他做檢查 , 以下是 Sun 的例子


◎將內容複製到剪貼簿◎

/**

* Remove the four-letter words from the specified

* collection, which must contain only strings.

*/

static void expurgate(Collection c) {

for (Iterator i = c.iterator(); i.hasNext(); ) {

String s = (String) i.next();

if(s.length() == 4)

i.remove();

}

}




為何要這麼麻煩呢,因為這世界上的系統實在太多,後端的資料庫型態非常的可怕
不可能始終都遇到僅有 ORACLE 或者 MSSQL 的狀況與環境
今天你可能遇到 DOMINO 或者遇到 XML 甚至是 saijone 文章中提到的 WSDL
這些都將會大大的影響你所得到的 Collection 非相同的資料型態
(尤其還越來越多人使用 EJB 來做 heterogeneous DB 整合,變數如此之嚇人)


◎將內容複製到剪貼簿◎

/**

* Remove the four-letter words from the specified collection of strings.

*/

static void expurgate(Collection<String> c) {

for (Iterator<String> i = c.iterator(); i.hasNext(); )

if (i.next().length() == 4)

i.remove();

}




這樣可以先一步避免掉 ClassCastException 在 Runtime 時期
(很多狀況下,程式需要先寫,測試用DB,但那些都不是正式啟用時的環境....)

我看了您的整理
感覺到 JAVA 的改版針對常會出狀況的邏輯錯誤 handle 有很多的改善!!
但不知道我哪時候才可以親身體會.....
我把一些 Generics 的文章貼一下
www.grayman.de/quiz/java-generics-en.quiz
Generics FAQs
了解泛型
Generic Types, Part 1
Erasure and Accidental Compile-Time Conflicts
Not wild enough
Wildcards in the Generics Specification
www.grayman.de/quiz/java-generics-en.quiz
www.devx.com/Java/Article/16024
java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf --Sun 的教學
www.davidflanagan.com/blog/000027.html --Generics Glossary

無痛苦 generics
www-106.ibm.com/developer ... ary/j-djc02113.html
www-106.ibm.com/developer ... ary/j-djc03113.html
www-106.ibm.com/developer ... ary/j-djc04093.html
www-106.ibm.com/developer ... ary/j-djc05133.html

www.langer.camelot.de/Gen ... ls of Java Generics
感覺 generics 幾乎是針對 collection 而設計的!

另外一個題外話,從 javaworld@tw 上查的
我看到這篇
www.javaworld.com.tw/jute ... y=1&age=0#17587
webservice 的策略更能發現 Sun 的後知後覺
直到 IBM 跳進來, Sun 才急忙在 j2ee 1.3 加入 Webservice 的功能

怪不得我在學 .NET 時感覺 web service 沒那麼難懂,不過就是透過 internet 做 method 的呼叫,而且點點幾下就可以幫你跑出一些底層的東西,可是看 java 的解決方案,什麼 jAXB 的一大堆,不知道從何下手?到現在還是完全不懂!請教我肉腳大師!
--------------------------------------------------------------
大陸 IBM 有關 Java5 的文章,介紹一下,須先註冊為會員:

馴服 Tiger: 從 XML 中裝載屬性
www-128.ibm.com/developer ... ger02254/index.html

馴服 Tiger: 格式化輸出
www-128.ibm.com/developer ... ger04024/index.html

Tiger 中的注釋
www-128.ibm.com/developer ... nnotate1/index.html
www-128.ibm.com/developerworks/cn/java/j-annotate2.html

馴服 Tiger: 當 Ocean 和 Synth 遇上 Metal--JDK 5.0 的兩種新外觀
www-128.ibm.com/developer ... ger10194/index.html

Java 理論與實踐: JDK 5.0 中更靈活、更具可伸縮性的鎖定機制
www-128.ibm.com/developer ... jtp10264/index.html

枚舉類型入門
www-128.ibm.com/developerworks/cn/java/j-enums.html

用 for/in 在 Java 5.0 中增強循環
www-128.ibm.com/developerworks/cn/java/j-forin.html

Java 理論和實踐: 了解泛型
www-128.ibm.com/developerworks/cn/java/j-jtp01255.html

Java語言與Generics
www-128.ibm.com/developer ... Generics/index.html

輕松掌握 Java 泛型
www-128.ibm.com/developer ... djc02113/index.html
www-128.ibm.com/developer ... djc03113/index.html
www-128.ibm.com/developer ... djc04093/index.html
www-128.ibm.com/developer ... djc05133/index.html

Java 理論與實踐: 流行的原子
www-128.ibm.com/developer ... jtp11234/index.html

馴服 Tiger: 利用 Tiger 為窗格減壓
www-128.ibm.com/developer ... ger02155/index.html

馴服 Tiger: 虛擬機更新
www-128.ibm.com/developerworks/cn/java/j-tiger03175.html

其他看到幾篇不錯的文章,跟 Java 5 沒關係
www-128.ibm.com/developerworks/cn/java/j-refs/index.html
www-128.ibm.com/developer ... jtp05254/index.html
www-128.ibm.com/developer ... ger08104/index.html

[ Last edited by jocosn on 2005-5-5 at 07:41 PM ]
----------------------------------------------------------------
引用:http://www.wwshare.idv.tw/Discuz/viewthread.php?tid=2815
0

评论Comments