一葉笑天
          雄關漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽如血。
          posts - 73,comments - 7,trackbacks - 0
          在Jdk1.5之前有兩種方式實現單例。它們都是采用維護私有構造器并且暴露一個static的成員函數來提供訪問單一實例對象。第一種方式是將成員變量聲明為final類型,例如:
          // Singleton with public final field
          public class Elvis {
          public static final Elvis INSTANCE = new Elvis();
          private Elvis()  }
          public void leaveTheBuilding()  }
          }
          另外一種方式是采用一個static的工廠方法:例如
          // Singleton with static factory
          public class Elvis {
          private static final Elvis INSTANCE = new Elvis();
          private Elvis()  }
          public static Elvis getInstance() return INSTANCE; }
          public void leaveTheBuilding()  }
          }
          public field方式的主要優勢是在于清楚的聲明了指定的類是單例的。
          static的工廠方法優勢在于可以靈活設置指定的類應不應該在不改變它的API的前提下是不是一個單例。
          為了實現用前面介紹的方式來實現單例的serializable,不能僅僅增加implement Serializable。為了一直保持單例狀態,必須聲明所有的屬性為transient,而且提供一個readResolve方法。否則當一個類反序列化的時候,新的實例將會隨之生成。為了保持Elvis類單例,可以增加下面的函數:
          // readResolve method to preserve singleton property
          private Object readResolve() {
          // Return the one true Elvis and let the garbage collector
          // take care of the Elvis impersonator.
          return INSTANCE;
          }
          在1.5中,還可以用另外一種方式實現單例。使用enum來保持類單例:
          // Enum singleton - the preferred approach
          public enum Elvis {
          INSTANCE;
          public void leaveTheBuilding()  }
          }
          除了它更簡明,這種方式等同于public屬性方式。免費提供了序列化機制,即使面對尖端的序列化或者反射攻擊,它都提供了堅實的單例。
          結論:
          這種方式還需要廣泛的采納,
          元素級的單例枚舉類型是最好的實現單例的方法。
          While this approach has yet to be widely
          adopted, a single-element enum type is the best way to implement a singleton.
          posted on 2008-06-18 21:49 一葉笑天 閱讀(374) 評論(0)  編輯  收藏 所屬分類: JAVA技術
          主站蜘蛛池模板: 定日县| 九寨沟县| 望江县| 琼海市| 平武县| 绥江县| 江都市| 错那县| 含山县| 花垣县| 隆安县| 观塘区| 山阳县| 深泽县| 基隆市| 西城区| SHOW| 塔城市| 宣化县| 玛沁县| 奎屯市| 宣汉县| 灌云县| 滁州市| 张掖市| 岳阳县| 东丰县| 民丰县| 陆河县| 邯郸县| 阳春市| 叶城县| 西华县| 横山县| 武夷山市| 海南省| 阿合奇县| 蛟河市| 郓城县| 湖南省| 广元市|