Saturday, April 10, 2004

 

Java 1.5 Note

之前po在個人版上的小筆記
有些程式我還是不知道是什麼用途
不過我覺得CyberJosJava 1.5寫得比我好很多
大家一起研究老虎吧~ ^^

http://java.sun.com/developer/technicalArticles/releases/j2se15/

Java的新東西:
  1. generic types
  2. metadata
  3. autoboxing
  4. an enhanced for loop
  5. enumerated types
  6. static import
  7. C style formatted input/output
  8. variable arguments
  9. concurrency utilities
  10. a simpler RMI interface generation.
The default language specification implemented by the javac compiler is version 1.4. That means that to take advantage of any of the following language changes requires passing the argument -source 1.5 to the javac command.

預設的 javac 無法編譯 1.5 的新語法,要加入 -source 1.5 參數才能順利編譯
另外發現這次的 compiler 比較會 complain
像是 show() method 已經被 deprecated 了
所以要加入 -Xlint:deprecation 參數
呼叫 collection 類別的 add() 也會叫
加入 -Xlint:unchecked 參數會讓他叫的比較清楚

所以要比較完整的訊息就用(in UE)
C:\j2sdk\bin\javac.exe -source 1.5 -Xlint:deprecation -Xlint:unchecked %f

Metadata

不是很懂這個東西
前年去 javatwo 聽蔡學鏞比較 java 跟 C# 的時候
他就說 C# 的 metadata 比 java 豐富許多

文中指出
The Metadata feature in J2SE 1.5 provides the ability to associate additional data alongside Java classes, interfaces, methods, and fields. This additional data, or annotation, can be read by the javac compiler or other tools, and depending on configuration can also be stored in the class file and can be discovered at runtime using the Java reflection API.
One of the primary reasons for adding metadata to the Java platform is to enable development and runtime tools to have a common infrastructure and so reduce the effort required for programming and deployment. A tool could use the Metadata information to generate additional source code or provide additional information when debugging.
In lieu of Metadata tools the following example creates an artificial debug Metadata annotation which is then simply displayed at runtime. It is envisioned that most Metadata tags form a standard, well-specified set.

我讀完後還是不太清楚這是幹嘛用的,好像是能夠有比較多資訊,比較好除錯之類的意思
下面他的範例就更讓我困惑了....
import java.lang.annotation.*;
import java.lang.reflect.*;

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @interface debug{
   boolean  devbuild() default false;
   int counter();
}

public class MetaTest{
   final boolean production=true;

   @debug(devbuild=production,counter=1) public void testMethod(){}

   public static void main(String[] args){
      MetaTest mt = new MetaTest();
      try{
      Annotation[] a = mt.getClass().getMethod("testMethod").getAnnotations();
      for(int i=0; i<a.length ; i++){
         System.out.println("a["+i+"]="+a[i]+" ");
      }
      } catch(NoSuchMethodException e) {
         System.out.println(e);
      }
  }
}
呃...什麼鬼語法阿...

另外...

Before
  public interface PingIF extends Remote {
      public void ping() throws RemoteException;
  }
  public class Ping implements PingIF {
     public void ping() {
     }
  }
After
  public class Ping {
     public @remote void ping() {
     }
  }
那個 @remote 是作什麼的呢...

Generic Types
之前有玩過,複習一下~
1.4:
  ArrayList list = new ArrayList();
  list.add(0, new Integer(42));
  int total = ((Integer)list.get(0)).intValue();
1.5:
  ArrayList<Integer> list =  new ArrayList<Integer>();
  list.add(0, new Integer(42));
  int total = list.get(0).intValue();
反正就是把原本的 ArrayList type 改成 ArrayList<Integer> type
這樣取出來就不用 cast 了。

Autoboxing and Auto-unboxing of Primitive Types

Generic 配上 Autoboxing 可以讓原本的程式更簡潔

1.4:
  ArrayList<Integer> list = new ArrayList<Integer>();
  list.add(0, new Integer(42));
  int total = (list.get(0)).intValue();
1.5:
  ArrayList<Integer> list = new ArrayList<Integer>();
  list.add(0, 42);
  int total = list.get(0);
連把 int 包成 Integer,與 Integer 轉成 int 的語法都省了~

Enhanced for loop

1.4:
  ArrayList<Integer> list = new ArrayList<Integer>();
  for (Iterator i = list.iterator(); i.hasNext();) {
     Integer value=(Integer)i.next();
  }
1.5:
  ArrayList<Integer> list = new ArrayList<Integer>();
  for (Integer i : list) { ... }
根本就不用拿 iterator 來檢閱 collection 的內容
直接把 collection 交給 for 就行了~
直接寫一個融合 Generic、Autoboxing、Enhanced loop 的程式給大家看看
public class Test{
    public static void main(String[] args){
      ArrayList<Integer> list = new ArrayList<Integer>();
      list.add(1);
      list.add(2);
      list.add(3);
      for(int i : list) {
         System.out.println(i);
      }
    }
}

Enumerated types
This type provides enumerated type when compared to using static final constants.
public enum StopLight { red, amber, green };
之前有聽過 C++ 的 enum,語法應該是差不多
應該是 StopLight.red、StopLight.amber、StopLight.green
就是列出一些東西的意思吧
然後...不知道要用在哪裡... @.@"

Static Import

The static import feature, implemented as "import static", enables you to refer to static constants from a class without needing to inherit from it.
Instead of BorderLayout.CENTER each time we add a component, we can simply refer to CENTER.
  import static java.awt.BorderLayout.*;
  getContentPane().add(new JPanel(), CENTER);
嗯嗯...就是省了 constants 前面的 class name 是吧..

Formatted Output

Developers now have the option of using printf type functionality to generated formatted output. This will help migrate legacy C applications, as the same text layout can be preserved with little or no change.
Most of the common C printf formatters are available, and in addition some Java classes like Date and BigInteger also have formatting rules. See the java.util.Formatter class for more information.
    System.out.printf("name count\n");
    System.out.printf("%s %5d\n", user,total);
就是 c 的 printf(),java 現在可以寫出不限制參數個數的 methods 了~
也就是下面會有介紹的 Varargs
不過我很好奇這樣 override 會不會有問題...

Formatted Input

The scanner API provides basic input functionality for reading data from the system console or any data stream. The following example reads a String from standard input and expects a following int value.

The Scanner methods like next and nextInt will block if no data is available.
If you need to process more complex input then there are also pattern matching algorithms, available from the java.util.Formatter class.
    Scanner s= new Scanner(System.in);
    String param= s.next();
    int value=s.nextInt();
    s.close();
嗯嗯,方便呀

Varargs

The varargs functionality allows multiple arguments to be passed as parameters to methods. It requires the simple ... notation for the method that accepts the argument list and is used to implement the flexible number of arguments required for printf.
    void argtest(Object ... args) {
      for (int i=0;i <args.length; i++) {
      }
    }

    argtest("test", "data");
以前寫不出來的東西現在可以寫出來了~
其他的東西以後有空再研究...反正還用不到... @.@"

Tiger Component JSRs

003 Java Management Extensions (JMX) Specification
http://jcp.org/en/jsr/detail?id=3

013 Decimal Arithmetic Enhancement
http://jcp.org/en/jsr/detail?id=13

014 Add Generic Types To The Java Programming Language
http://jcp.org/en/jsr/detail?id=14

028 Java SASL Specification
http://jcp.org/en/jsr/detail?id=28

114 JDBC Rowset Implementations
http://jcp.org/en/jsr/detail?id=114

133 Java Memory Model and Thread Specification Revision
http://jcp.org/en/jsr/detail?id=133

160 Java Management Extensions (JMX) Remote API 1.0
http://jcp.org/en/jsr/detail?id=160

163 Java Platform Profiling Architecture
http://jcp.org/en/jsr/detail?id=163

166 Concurrency Utilities
http://jcp.org/en/jsr/detail?id=166

174 Monitoring and Management Specification for the Java Virtual Machine
http://jcp.org/en/jsr/detail?id=174

175 A Metadata Facility for the Java Programming Language
http://jcp.org/en/jsr/detail?id=175

200 Network Transfer Format for Java Archives
http://jcp.org/en/jsr/detail?id=200

201 Extending the Java Programming Language with Enumerations, Autoboxing, Enhanced for Loops and Static Import
http://jcp.org/en/jsr/detail?id=201

204 Unicode Supplementary Character Support
http://jcp.org/en/jsr/detail?id=204

206 Java API for XML Processing (JAXP) 1.3
http://jcp.org/en/jsr/detail?id=206
由 swanky 發表於 April 10, 2004 12:38 AM
迴響

Scanner s=Scanner.create(System.in);

这个语法有问题啊,
Scanner s=new Scanner(System.in);
这样才行.楼主确认一下哦。

Posted by: amou 發表於 2005-03-15 09:09 AM

謝謝!
已更正 :)

Posted by: swanky 發表於 2005-03-15 10:30 PM

Metadata 就是所謂的 Program Annotation Facility (程式註解工具)

Annotations 的使用:
‧ Java 5 內建的 annotations(built-in annotations)
1. @Override annotation
 A) 指明該 method 覆寫(override)基底類別的 method。
 B) 只能用在 methods (不能用在 classes、package declarations、constructs)。
 C) 為 marker annotation。

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

3. @SuppressWarnings
 A) single-annotation
 B) 可關掉 classes、methods、field、或 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
}

‧自定註文
使用步驟
[步驟一] 定義註文型態(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" 告知編譯器如何處理 annotated annotation type,處理方式有:
  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 { }

Posted by: jocosn 發表於 2005-04-08 08:19 AM

[步驟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 { ... }

Posted by: jocosn 發表於 2005-04-08 08:26 AM

Comments: Post a Comment



<< Home