ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          范例(Examples)
          讓我們從一個表示[貨幣種類]的Currency class開始:
          class Currency...
              private String _code;

              public String getCode() {
                 return _code;
              }

              private Currency(String code) {
                 _code = code;
              }
          這個class所做的就是保存并返回一個貨幣種類代碼。它是一個reference object,所以如果要得到它的一份實體,必須這么做:
              Currency usd = Currency.get("USD");
          Currency class維護一個實體鏈表(list of instances);我不能直接使用構造函數創建實體,因為Currency構造函數是private。
          new Currency("USD").equals(new Currency("USD"));   //return false

          要把一個reference object變成value object,關鍵動作是:檢查它是否為immutable(不可變)。如果不是,我就不能使用本項重構,因為mutable(可變的)value object會造成令人苦惱的別名現象(aliasing)。

          在這里,Currency對象是不可變的,所以下一步就是為它定義equals():
          public boolean equals(Object arg) {
              if(!(arg instanceof Currency)) return false;
              Currency other = (Currency)arg;
              return (_code.equals(other._code));
          }

          如果我定義equals(),我必須同時定義hashCode()。實現hashCode()有個簡單辦法:讀取equals()使用的所有值域的hash codes,然后對它們進行bitwise xor(^)操作。本例中這很容易實現,因為equals()只使用了一個值域:
          public int hashCode() {
              return _code.hashCode():
          }
          完成這兩個函數后,我可以編譯并測試。這兩個函數的修改必須同時進行,否則依賴hashing的任何群集對象(collections,例如Hashtable、HashSet和HashMap)可能會產生意外行為。

          現在,我想創建多少個等值的Currency對象就創建多少個。我還可以把構造函數聲明為public,直接以構造函數獲取Currency實體,從而去掉Currency class中的factory method和[控制實體創建]的行為:
          new Currency("USD").equals(new Currency("USD"));   //now returns true
          posted on 2005-09-05 11:04 ivaneeo 閱讀(279) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
          主站蜘蛛池模板: 沽源县| 南岸区| 黄冈市| 贵南县| 和平县| 沁水县| 波密县| 孟州市| 西乡县| 南昌市| 桐梓县| 共和县| 河东区| 宣化县| 广宗县| 普陀区| 都昌县| 周宁县| 武城县| 商丘市| 桂林市| 安阳县| 临邑县| 建平县| 顺义区| 纳雍县| 青阳县| 河津市| 边坝县| 监利县| 邮箱| 南充市| 海门市| 藁城市| 炎陵县| 彭阳县| 卢湾区| 镇远县| 西青区| 长寿区| 昂仁县|