<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 75,comments - 83,trackbacks - 0

    ?

    增強的for循環

      為了迭代集合和數組,增強的for循環提供了一個簡單、兼容的語法。有兩點值得一提:   Init表達式

      在循環中,初始化表達式只計算一次。這意味著您通常可以移除一個變量聲明。在這個例子中,我們必須創建一個整型數組來保存computeNumbers()的結果,以防止每一次循環都重新計算該方法。您可以看到,下面的代碼要比上面的代碼整潔一些,并且沒有泄露變量numbers:
      未增強的For:  int sum = 0;  Integer[] numbers = computeNumbers();  for (int i=0; i < numbers.length ; i++)    sum += numbers[i];
     
      增強后的For:    int sum = 0;  for ( int number: computeNumbers() ) sum += number;
      局限性

      有時需要在迭代期間訪問迭代器或下標,看起來增強的for循環應該允許該操作,但事實上不是這樣,請看下面的例子:
    for (int i=0; i < numbers.length ; i++) {    if (i != 0) System.out.print(",");    System.out.print(numbers[i]);}

      我們希望將數組中的值打印為一個用逗號分隔的清單。我們需要知道目前是否是第一項,以便確定是否應該打印逗號。使用增強的for循環是無法獲知這種信息的。我們需要自己保留一個下標或一個布爾值來指示是否經過了第一項。   這是另一個例子:

    for (Iterator<integer> it = n.iterator() ; it.hasNext() ; )    if (it.next() < 0)        it.remove();

      在此例中,我們想從整數集合中刪除負數項。為此,需要對迭代器調用一個方法,但是當使用增強的for 循環時,迭代器對我們來說是看不到的。因此,我們只能使用java 5之前版本的迭代方法。   順便說一下,這里需要注意的是,由于Iterator是泛型,所以其聲明是Iterator<Integer>。許多人都忘記了這一點而使用了Iterator的原始格式。

      注釋

      見http://m.tkk7.com/tangzurui/archive/2008/07/22/216555.html

    ??????? 枚舉


      enum非常像public static final int聲明,后者作為枚舉值已經使用了很多年。對int所做的最大也是最明顯的改進是類型安全——您不能錯誤地用枚舉的一種類型代替另一種類型,這一點和int不同,所有的int對編譯器來說都是一樣的。除去極少數例外的情況,通常都應該用enum實例替換全部的枚舉風格的int結構。

      枚舉提供了一些附加的特性。EnumMap和EnumSet這兩個實用類是專門為枚舉優化的標準集合實現。如果知道集合只包含枚舉類型,那么應該使用這些專門的集合來代替Has                                   hMap或HashSet。

      大部分情況下,可以使用enum對代碼中的所有public static final int做插入替換。它們是可比的,并且可以靜態導入,所以對它們的引用看起來是等同的,即使是對于內部類(或內部枚舉類型)。注意,比較枚舉類型的時候,聲明它們的指令表明了它們的順序值。

      “隱藏的”靜態方法

      兩個靜態方法出現在所有枚舉類型聲明中。因為它們是枚舉子類上的靜態方法,而不是Enum本身的方法,所以它們在java.lang.Enum的javadoc中沒有出現。

      第一個是values(),返回一個枚舉類型所有可能值的數組。

      第二個是valueOf(),為提供的字符串返回一個枚舉類型,該枚舉類型必須精確地匹配源代碼聲明。

      方法

      關于枚舉類型,我們最喜歡的一個方面是它可以有方法。過去您可能需要編寫一些代碼,對public static final int進行轉換,把它從數據庫類型轉換為JDBC URL。而現在則可以讓枚舉類型本身帶一個整理代碼的方法。下面就是一個例子,包括DatabaseType枚舉類型的抽象方法以及每個枚舉實例中提供的實現:
      public enum  DatabaseType {  Oracle {  public String getJdbcUrl() {...}  },  MySQL {  public String getJdbcUrl() {...}  };  public abstract String getJdbcUrl();  }
      現在枚舉類型可以直接提供它的實用方法。例如:

    DatabaseType dbType = ...;
    String jdbcURL = dbType.getJdbcUrl();

      要獲取URL,必須預先知道該實用方法在哪里。

      可變參數(Vararg)

      正確地使用可變參數確實可以清理一些垃圾代碼。典型的例子是一個帶有可變的String參數個數的log方法:?

    ??? Log.log(String code)
    ??? Log.log(String code,? String arg)
    ??? Log.log(String code,? String arg1, String arg2)
    ??? Log.log(String code,? String[] args)

      當討論可變參數時,比較有趣的是,如果用新的可變參數替換前四個例子,將是兼容的:

    Log.log(String code, String... args)

      所有的可變參數都是源兼容的——那就是說,如果重新編譯log()方法的所有調用程序,可以直接替換全部的四個方法。然而,如果需要向后的二進制兼容性,那么就需要舍去前三個方法。只有最后那個帶一個字符串數組參數的方法等效于可變參數版本,因此可以被可變參數版本替換。

    ?詳情見:http://m.tkk7.com/tangzurui/archive/2008/07/25/217518.html


      類型強制轉換


      如果希望調用程序了解應該使用哪種類型的參數,那么應該避免用可變參數進行類型強制轉換??聪旅孢@個例子,第一項希望是String,第二項希望是Exception:
        Log.log(Object...  objects) {    String message = (String)objects[0];    if (objects.length > 1) {    Exception e = (Exception)objects[1];    // Do something with the exception    }    }
      方法簽名應該如下所示,相應的可變參數分別使用String和Exception聲明:

    Log.log(String message, Exception e, Object... objects) {...}

      不要使用可變參數破壞類型系統。需要強類型化時才可以使用它。對于這個規則,PrintStream.printf()是一個有趣的例外:它提供類型信息作為自己的第一個參數,以便稍后可以接受那些類型。

      協變返回


      協變返回的基本用法是用于在已知一個實現的返回類型比API更具體的時候避免進行類型強制轉換。在下面這個例子中,有一個返回Animal對象的Zoo接口。我們的實現返回一個AnimalImpl對象,但是在JDK 1.5之前,要返回一個Animal對象就必須聲明。:
        public interface Zoo  {    public Animal getAnimal();    }  public class ZooImpl  implements Zoo {  public Animal getAnimal(){  return new AnimalImpl();  }  }
      協變返回的使用替換了三個反模式:

    ?

    • 直接字段訪問。為了規避API限制,一些實現把子類直接暴露為字段: ZooImpl._animal
    • 另一種形式是,在知道實現的實際上是特定的子類的情況下,在調用程序中執行向下轉換: ((AnimalImpl)ZooImpl.getAnimal()).implMethod();
    • 我看到的最后一種形式是一個具體的方法,該方法用來避免由一個完全不同的簽名所引發的問題: ZooImpl._getAnimal();


      這三種模式都有它們的問題和局限性。要么是不夠整潔,要么就是暴露了不必要的實現細節。

      協變

      協變返回模式就比較整潔、安全并且易于維護,它也不需要類型強制轉換或特定的方法或字段:

    public AnimalImpl getAnimal(){
    return new AnimalImpl();
    }

      使用結果:
    ZooImpl.getAnimal().implMethod();

      使用泛型

      
    我們將從兩個角度來了解泛型:使用泛型和構造泛型。我們不討論List、Set和Map的顯而易見的用法。知道泛型集合是強大的并且應該經常使用就足夠了。

      我們將討論泛型方法的使用以及編譯器推斷類型的方法。通常這些都不會出問題,但是當出問題時,錯誤信息會非常令人費解,所以需要了解如何修復這些問題。

    posted on 2008-07-21 23:01 梓楓 閱讀(257) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 亚洲乱码一区av春药高潮| 亚洲AV无码一区二区三区在线观看 | 国色精品卡一卡2卡3卡4卡免费| 久久香蕉国产线看免费| 成全视频在线观看免费| 三年片在线观看免费西瓜视频| 两个人的视频www免费| 东北美女野外bbwbbw免费| 在线免费观看伊人三级电影| 国产高潮流白浆喷水免费A片 | a免费毛片在线播放| 中文字幕在线视频免费观看| 日韩免费高清播放器| 午夜网站在线观看免费完整高清观看| 国产精品偷伦视频观看免费| 久久免费观看国产99精品| 最近新韩国日本免费观看| 2020因为爱你带字幕免费观看全集| 久久精品免费观看国产| 18禁黄网站禁片免费观看不卡| 国产免费久久精品99re丫y| 亚洲第一成年免费网站| 免费黄网在线观看| 免费人成在线观看播放国产| 亚洲成AV人在线观看网址| 国产成人综合亚洲亚洲国产第一页 | 三年在线观看免费观看完整版中文 | 国产亚洲综合一区柠檬导航| 久久久久亚洲精品影视| 亚洲另类自拍丝袜第1页| 亚洲欧美一区二区三区日产| 精品成人一区二区三区免费视频| 日韩免费码中文在线观看| a级黄色毛片免费播放视频| 国产精品久久久久久久久免费| 成年女人18级毛片毛片免费 | 成人无码区免费视频观看| 国产在线播放免费| 不卡精品国产_亚洲人成在线| 亚洲ⅴ国产v天堂a无码二区| 亚洲三级视频在线|