我學習使用java的一點體會(4) (轉)

amyz發表於2007-08-16
我學習使用java的一點體會(4) (轉)[@more@]

  本文的上一篇發表之後,承蒙各位網友關注,發表了很多評論,我感覺很多人對我寫得文章有誤解,大概是我表述不清楚的原因吧。這篇文章是對上一篇的補充,以一個示例闡述瞭解collection的重要性。

  我在半年以前寫過一個printAll(Vector vector),具體程式碼如下

import .util.*;

public class UtilTool
{
 public static void printAll ( Vector vector )
 {
 System.out.println( "the Collection is vector" );
 System.out.println( vector.getClass().toString() );
 Iterator iterator = vector.iterator();
 while ( iterator.hasNext() )
 {
 System.out.println(iterator.next().toString());
 }
 }

public static void main( String[] arg )
 {
 Vector vector = new Vector();
 vector.add( new Integer(1));
 vector.add( new Integer(2));
 vector.add( new Integer(3));
 UtilTool.printAll(vector);
}

}

  printAll這個函式設計的很不好——不夠通用,假如,還想列印HashSet型別的資料,你就必須過載printAll函式,程式碼如下

public static void printAll ( HashSet hashSet )
 {
 System.out.println( "the Collection is hashSet" );
 System.out.println( hashSet.getClass().toString() );
 Iterator iterator = hashSet.iterator();
 while ( iterator.hasNext() )
 {
 System.out.println(iterator.next().toString());
 }
 }

  printAll函式的程式碼重用率低。其實Vector和 HashSet都是Collection的實現,可以將printAll的引數型別改為Collection,而不必過載。程式碼如下

public static void printAll ( Collection collection )
 {
 System.out.println( "the Collection is collection" );
 System.out.println( collection.getClass().toString() );
 Iterator iterator = collection.iterator();
 while ( iterator.hasNext() )
 {
 System.out.println(iterator.next().toString());
 }
 }
  這樣就可以刪除printAll(Vector vector)和printAll(HashSet hashSet)函式了。

  在設計函式時,應優先使用介面,而不是類。當然必須瞭解Vector 是Collection的實現。

  如果對Collection的繼承關係不清楚,很容易濫用過載,以下程式碼是一個有問題的程式碼(摘自Effective Java Programming Language Gu)

public class CollectionClassifier{

  public static String classify(Set s){

  return "Set";

  }

  public static String classify(List l){

  return "List";

  }

  public static String classify(Collection c){

  return "Unknow Collection";

  }

  public static void main( String[] args )

  Collection[] tests = new Collection[]{

  new HashSet(),

  new ArrayList(),

  new HashMap().values()

 }

  for(int i=0;i

  System.out.println(classify(test[i]));

  }

}

輸出的是三次"Unknown Collection",而不是你期望的列印"Set","List"以及"Unknown Collection"。這個程式錯誤的根源是對Collection層次結構不熟悉,而濫用過載導致。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-962527/,如需轉載,請註明出處,否則將追究法律責任。

相關文章