莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          方法簽名,泛型濫用?

          Posted on 2009-05-24 20:05 dennis 閱讀(2200) 評論(5)  編輯  收藏 所屬分類: java

              最近遇到一個選擇題,在xmemcached中,get方法原來的簽名是這樣的:
          public Object  get(final String key) throws TimeoutException,InterruptedException,MemcachedException;
              那么用戶使用的時候,需要自己轉型,也就是這樣

          String value=(String)client.get("key");

              后來我將get方法的簽名改成了泛型方法,xmemcached幫你做這個轉型工作,
          public <T> T get(final String key) throws TimeoutException,InterruptedException, MemcachedException;

              方法的實現因為有了個轉型,不得不加上抑制警告,
              @SuppressWarnings("unchecked")
              
          public final <T> T get(final String key) throws TimeoutException,
                      InterruptedException, MemcachedException {
                  
          return (T) get(key, DEFAULT_OP_TIMEOUT);
              }
              這樣用戶使用的時候,就不需要顯式轉型,而是xmemcached幫你做了,
          String value=client.get("key");
              后來,我仔細想了這個問題,盡管這里使用了泛型方法,似乎簡化了用戶的工作,然而卻丟掉了編譯警告,抑制警告讓用戶可能忽略這里可能的轉型失敗,這與泛型的初衷似乎不符。可是,另一個觀點冒出來支持我,用戶往memcached存進去一頭大象,他(她)不會希望取出來的時候變成驢子,我們幫他做這個轉型工作可以讓用戶使用起來更簡便。你怎么看呢?
              
               


          評論

          # re: 方法簽名,泛型濫用?  回復  更多評論   

          2009-05-24 23:23 by megan
          學習了,
          我覺得忠于用戶感受是最重要的。

          # re: 方法簽名,泛型濫用?  回復  更多評論   

          2009-05-25 19:30 by ecbeta
          這個似乎有點問題. 因為你有一個方法是需要轉型的,那為什么那個方法不是泛型的呢?

          # re: 方法簽名,泛型濫用?  回復  更多評論   

          2009-06-07 01:35 by cast
          try this:

          public final <T> T get(final String key, Class<T> clz) throws TimeoutException,
          InterruptedException, MemcachedException {
          return clz.cast(get(key, DEFAULT_OP_TIMEOUT));
          // if it is not T type, it will raise ClassCastException in cast() method.
          }

          # re: 方法簽名,泛型濫用?  回復  更多評論   

          2009-06-07 07:14 by dennis
          是的,這是個辦法,然后這與讓用戶自己轉型沒有多大區別,用戶還是傳入一個額外的參數,反而更麻煩。

          # re: 方法簽名,泛型濫用?[未登錄]  回復  更多評論   

          2011-07-15 12:39 by Jeff
          個人覺得這里還是不要范型的好。
          作為一個基礎接口,此處存的對象千奇百怪,調用者更應該負責將對象cast回自己所需要的對象,因為他自己必須明白自己曾經放了什么對象。

          主站蜘蛛池模板: 天峨县| 甘肃省| 楚雄市| 鄂托克旗| 鲁甸县| 石门县| 山西省| 普宁市| 旬阳县| 东光县| 建始县| 永福县| 双流县| 汽车| 澄江县| 仁布县| 略阳县| 大方县| 富源县| 西平县| 胶州市| 奉新县| 和龙市| 武乡县| 高雄市| 梓潼县| 平乐县| 鄂托克旗| 平塘县| 阿拉善右旗| 时尚| 安徽省| 曲水县| 突泉县| 玉林市| 建水县| 谢通门县| 海宁市| 长春市| 康平县| 赤峰市|