<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### Replace Array with Object(以對象取代數組) 你有一個reference object(引用對象),很小且不可變(immutable),而且不易管理。 將它變成一個value object(實值對象)。 ![](https://box.kancloud.cn/2016-08-15_57b1b56cf27c7.gif) **動機(Motivation)** 正如我在Change Reference to Value 中所說,要在reference object和value object之間做選擇,有時并不容易。作出選擇后,你常會需要一條回頭路。 如果reference object開始變得難以使用,也許你就應該將它改為value object。 reference object必須被某種方式控制,你總是必須向其控制者請求適當的reference object。它們可能造成內存區域之間錯綜復雜的關聯。在分布系統和并發系統中,不可變的value object特別有用,因為你無須考慮它們的同步問題。 value object有一個非常重要的特性:它們應該是不可變的(immutable)。無論何時只要你調用同一對象的同一個查詢函數,你都應該得到同樣結果。如果保證了這一 點,就可以放心地以多個對象表示相同事物(same thing)。如果value object是可變的(mutable),你就必須確保你對某一對象的修改會自動更新其他「代表相同事物」的其他對象。這太痛苦了,與其如此還不如把它變成reference object。 這里有必要澄清一下「不可變(immutable)」的意思。如果你以Money class表示「錢」的概念,其中有「幣種」和「金額」兩條信息,那么Money對象通常是一個不可變的value object。這并非意味你的薪資不能改變,而是意味:如果要改變你的薪資,你需要使用另一個嶄新的Money對象來取代現有的Money對象,而不是在現有的Money對象上修改。你和Money對象之間的關系可以改變,但Money對象自身不能 改變。 譯注:《Practical Java》 by Peter Haggar第6章對于mutable/immutable有深入討論。 **作法(Mechanics)** - 檢查重構對象是否為immutable(不可變)對象,或是否可修改為不可變對象。 - 如果該對象目前還不是immutable,就使用 Remove Setting Method,直到它成為immutable為止。 - 如果無法將該對象修改為immutable,就放棄使用本項重構。 - 建立equal()和hashCode()。 - 編譯,測試。 - 考慮是否可以刪除factory method,并將構造函數聲明public 。 **范例(Example)** 讓我們從一個表示「貨幣種類」的Currency class開始: ~~~ class Currency... private String _code; public String getCode() { return _code; } private Currency (String code) { _code = code; } ~~~ 這個也所做的就是保存并返回一個貨幣種類代碼。它是一個reference object,所以如果要得到它的一份實體,必須這么做: ~~~ Currency usd = Currency.get("USD"); ~~~ Currency class維護一個實體鏈表(list of instances);我不能直接使用構造函數創建實體,因為Currency構造函數是private。 ~~~ new Currency("USD").equals(new Currency("USD")) // returns 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 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看