Junky's IT Notebook

          統(tǒng)計(jì)

          留言簿(8)

          積分與排名

          WebSphere Studio

          閱讀排行榜

          評(píng)論排行榜

          對(duì)java 5除generic外的new features的總結(jié)

          The for-each loop

          for (type_name variable_name : [instance of Iterable<T>] or [array]) {}

          .net foreach 不同的是, Iterable 中的 type parameter array 中的 element type 必須是 for 中使用的 type 或者其子類(lèi)。

          以下情況不適合使用 foreach

          1.?????? 當(dāng)需要?jiǎng)h除或者替換 current element 時(shí)。

          2.?????? 當(dāng)需要同時(shí)訪問(wèn)一個(gè)以上的 Iterable<T> 或者 array 時(shí)。

          Autoboxing

          一般的代碼經(jīng)常會(huì)使用 boxing unboxing ,如:

          List list = new ArrayList();

          int i = 0;

          list.add(new Integer(i)); // boxing

          i = ((Integer) list.get(0)).intValue(); // unboxing

          采用了 autoboxing 之后, java 能夠自動(dòng)在 primitive type 它相應(yīng)的 wrapper 之間進(jìn)行轉(zhuǎn)換。

          // autoboxing

          list.add(i);

          i = list.get(0);

          Integer 為例,以下幾點(diǎn)是需要注意的:

          1.?????? 當(dāng)試圖將值為 null Integer 轉(zhuǎn)為 int 時(shí),會(huì)有 NullPointerException

          int i = (Integer) null;

          2.?????? 對(duì)于 == 操作符,當(dāng)它作用在 int 上時(shí)是做值的比較,作用于 Integer 上時(shí)是做 reference 的比較。

          int i1 = 0;

          Integer i2 = new Integer(0);

          i1 == i2; // return true

          i2 == i1; // return true

          (Integer) i1 == i2; // return false

          3.?????? 如果頻繁使用 autoboxing 將不利于代碼的運(yùn)行效率。

          Enums

          public enum Test { // 1

          A, B(1), C { public boolean test1() { return true; } } /* 5 */ ; // 2

          private int i = 0;

          Test() {} // 3

          private Test(int i) { this.i = i; } // 3

          public boolean test1() { return false; } // 5

          public boolean test2(Test test) { return test != A && test !=B; } // 6

          // 7

          public boolean test3() {

          ????? switch (this) {

          case A: return false;

          case B: return false;

          default: return true;

          }

          }

          }

          Enum 跟一般的類(lèi)有很多相似之處,它們都能夠?qū)崿F(xiàn)多個(gè)接口,能夠定義方法、類(lèi)變量,除了這些相似點(diǎn)之外, enum 有如下的特性:

          1.?????? 必須使用 enum 關(guān)鍵字來(lái)定義,不能用 extends 指定父類(lèi),假如 enum 的名字為 Test ,則它自動(dòng)繼承 Enum<Test> 。與此同時(shí), enum 還自動(dòng)實(shí)現(xiàn) Serializable comparable 接口,并且自動(dòng)重載了部分 Object 的方法。

          2.?????? 所有的可用 enum constant 必須放在第一行,用逗號(hào)格開(kāi),以分號(hào)結(jié)束(如果后面沒(méi)有其他的代碼,則分號(hào)可以省略)。通過(guò)專(zhuān)門(mén)設(shè)計(jì),使得 Serial form 可以支持后續(xù)新增的 enum constant

          3.?????? 可以定義若干不同的構(gòu)造函數(shù),構(gòu)造函數(shù)只能用 private 修飾符(可以省略掉 private ),當(dāng)構(gòu)造函數(shù)需要輸入?yún)?shù)時(shí), enum constant 的定義中必須提供這些參數(shù)的值。

          4.?????? 自動(dòng)增加了 values() valueOf Class<T>, String )、 valueOf(String) 三個(gè)靜態(tài)方法。

          5.?????? 可以為 enum constant 定義 constant-specific 方法。

          6.?????? 在代碼中可以引用前面所定義的類(lèi)型。

          7.?????? 由于 switch 可以應(yīng)用于 int enum 類(lèi)型,在代碼中可以使用 ”switch (this) {…}” 語(yǔ)句。

          8.?????? java.util 中有專(zhuān)為 enum 設(shè)計(jì)的高效率的 EnumSet EnumMap ,其中 EnumSet 提供對(duì)方法以使 enum 支持位與( bit flags )操作。

          Varargs

          在方法的參數(shù)列表上,如果類(lèi)型后面加上三個(gè)點(diǎn),則表示該參數(shù)可能作為數(shù)組或者多個(gè)參數(shù)傳入,如:

          public void test(int… arguments) {}

          test(1);

          test(1, 2, 3);

          test(new int[0]);

          .net 類(lèi)似的, varargs 必須作為方法的最后一個(gè)參數(shù)。如果對(duì)使用 varargs 的方法進(jìn)行重載,則在調(diào)用該方法時(shí),有可能 compiler 無(wú)法識(shí)別代碼究竟調(diào)用的是哪個(gè)方法,此時(shí)會(huì)有編譯錯(cuò)誤。

          Static Import

          Static import 用來(lái) import 類(lèi)中的靜態(tài)變量或靜態(tài)方法,使用了 static import 之后,這些使用這些靜態(tài)變量和靜態(tài)方法時(shí)將不需要使用類(lèi)名。

          import static java.lang.Math.PI;

          import static java.lang.Math.*;

          Annotations

          Annotation 的定義

          public @interface Test {

          ????? int value();

          ????? String name() default “test”;

          }

          定義 annotation 使用 @interface 關(guān)鍵字。 annotation 能使用的類(lèi)型為 primitive String Class enums 以及以以上類(lèi)型為 element type 的數(shù)組。使用 default 關(guān)鍵字能夠設(shè)定默認(rèn)值,默認(rèn)值必須是 compile time constants

          Annotation 的使用的語(yǔ)法跟 java doc 的語(yǔ)法相似,為了區(qū)分這兩者, annotation 的命名不能使用已有的 java doc 中所用的名字。

          java.lang.annotation 中存在若干 mata-annotation ,用于 annotate 其他的 annotation

          Annotation 的使用

          首先,必須 import annotation 所在的包, annotation 可以放在在任何 static public final 關(guān)鍵字可以使用的地方,建議把 annotation 放在最前面。

          @Test(value=0)

          public class A {

          @Test(Value=0, name=”abc”) public void test(@Test(0) Object o) {}

          }

          對(duì) annotation 中各個(gè)變量的賦值作為 name value pair 被放在括號(hào)內(nèi),同時(shí)用逗號(hào)格開(kāi),如果 annotation 中沒(méi)有任何變量或者所有變量都有默認(rèn)值,則可以省去賦值部分(連同括號(hào)),如果 annotation 中有一個(gè)名字為 value 的變量,同時(shí)沒(méi)有其他的變量或者其他的變量都有默認(rèn)值,則可以只提供值而省略 element name 和等號(hào)。

          讀出 annotation 的包含的信息

          通過(guò) reflection 可以讀出 annotation 所包含的信息,有一部分 annotation 通過(guò)使用 meta-annotation 被聲明為 runtime 不可知,這時(shí)通過(guò)分析 byte code 才能得到其信息。

          posted on 2006-12-27 09:36 junky 閱讀(310) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): java

          主站蜘蛛池模板: 武川县| 邢台市| 吉首市| 饶河县| 句容市| 雅江县| 丘北县| 江都市| 利川市| 龙川县| 宁远县| 阿坝县| 北海市| 宜丰县| 南木林县| 德惠市| 报价| 霍林郭勒市| 绥德县| 丽江市| 宜都市| 儋州市| 乌兰浩特市| 利津县| 天等县| 天津市| 瓦房店市| 舟曲县| 娄底市| 台东县| 沙洋县| 灵石县| 当阳市| 图木舒克市| 廊坊市| 柏乡县| 阿克| 大城县| 西丰县| 鹰潭市| 济南市|