posts - 8,  comments - 6,  trackbacks - 0

          1.3  執(zhí)行安全存放:使用類型安全映射

          Java5+

          正如前面討論for循環(huán)時看到的那樣,使用泛型有助于簡化代碼并降低出錯概率。for循環(huán)會假定ArrayList僅包含Integer對象,因為ArrayList嚴(yán)格地被定義為由Integer對象組成。因而當(dāng)從列表檢索項目時可以避免從Object到Integer的強制類型轉(zhuǎn)換。

          Java 5對核心API做出了很多利用泛型的更改。查看相關(guān)文檔你會發(fā)現(xiàn)已重新定義了很多類以允許使用泛型。如果愿意的話,仍可以按照以前的方式構(gòu)造和使用這些類,例如使用new ArrayList()。這樣做的原因是為了兼容性,以便仍可以在舊版本的編譯器下運行代碼。當(dāng)然,這樣會失去泛型提供的類型檢查帶來的便利性和安全性。

          一個得到很好修訂的類是java.util.Map (和HashMap)。我們知道,映射操作就像查表一樣,每個值都存儲在一個唯一的鍵標(biāo)下。在早期的Java版本中,當(dāng)在映射表中放置表項時,它們是作為Object項存放的。當(dāng)從映射表中檢索表項時,它被作為標(biāo)準(zhǔn)的Object引用來對待,即被強制轉(zhuǎn)換成正確的子類以便能夠識別為它的實際類型。這與List中存在的危險相同。要么對象不正確,要么出現(xiàn)ClassCastException異常,這樣的情況太常見了。

          假定有一個用于維護員工數(shù)據(jù)的Employee類。下面給出一些使用HashMap的典型代碼:

          Employee brian = new Employee();
          brian.setName("Brian", "Eubanks");
          brian.setSalary(100000.00);
          brian.setTitle("Boss");

          HashMap employees = new HashMap();
          employees.put("Brian", brian);

          Employee newHire = (Employee) employees.get("Brian");
          newHire.setHireDate(new Date());

          在檢索項目時,最大的危險位于強制類型轉(zhuǎn)換的過程中。使用Java 5,不用強制類型轉(zhuǎn)換也可完成此操作,只要使用正確的類型來實例化Map。可以對鍵和值的類型添加約束。在下面的示例中,只允許String鍵和Employee值:
          Employee brian = new Employee();
          brian.setName("Brian", "Eubanks");
          brian.setSalary(100000.00);
          brian.setTitle("Boss");

          HashMap<String,Employee> employees = new HashMap<String,Employee>();
          employees.put("Brian", brian);

          // no cast is necessary here
          Employee newHire = employees.get("Brian");
          newHire.setHireDate(new Date());


          通過使用類型安全映射,當(dāng)從映射表中檢索表項時可以避免ClassCastException錯誤。這樣做使代碼更加穩(wěn)定并且降低對映射內(nèi)容的敏感性。但如果代碼必須運行在早期版本的Java上,那么將處于不利的情況并且需要暫時繼續(xù)執(zhí)行強制類型轉(zhuǎn)換。但可以采用下一節(jié)中的方法,創(chuàng)建自己的泛型類。


          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 安福县| 如皋市| 淄博市| 万源市| 剑川县| 霍邱县| 璧山县| 阜阳市| 芦溪县| 武隆县| 武鸣县| 景洪市| 墨玉县| 延庆县| 体育| 灌云县| 林西县| 崇阳县| 枝江市| 昌乐县| 新沂市| 金塔县| 神木县| 洪湖市| 孝义市| 金平| 张家界市| 乐安县| 襄汾县| 巴塘县| 龙南县| 仲巴县| 定南县| 恩平市| 西宁市| 阿克| 兴安盟| 济宁市| 石狮市| 潜江市| 梓潼县|