一葉笑天
          雄關(guān)漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽(yáng)如血。
          posts - 73,comments - 7,trackbacks - 0
          在Jdk1.5之前有兩種方式實(shí)現(xiàn)單例。它們都是采用維護(hù)私有構(gòu)造器并且暴露一個(gè)static的成員函數(shù)來(lái)提供訪問(wèn)單一實(shí)例對(duì)象。第一種方式是將成員變量聲明為final類型,例如:
          // Singleton with public final field
          public class Elvis {
          public static final Elvis INSTANCE = new Elvis();
          private Elvis()  }
          public void leaveTheBuilding()  }
          }
          另外一種方式是采用一個(gè)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方式的主要優(yōu)勢(shì)是在于清楚的聲明了指定的類是單例的。
          static的工廠方法優(yōu)勢(shì)在于可以靈活設(shè)置指定的類應(yīng)不應(yīng)該在不改變它的API的前提下是不是一個(gè)單例。
          為了實(shí)現(xiàn)用前面介紹的方式來(lái)實(shí)現(xiàn)單例的serializable,不能僅僅增加implement Serializable。為了一直保持單例狀態(tài),必須聲明所有的屬性為transient,而且提供一個(gè)readResolve方法。否則當(dāng)一個(gè)類反序列化的時(shí)候,新的實(shí)例將會(huì)隨之生成。為了保持Elvis類單例,可以增加下面的函數(shù):
          // 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中,還可以用另外一種方式實(shí)現(xiàn)單例。使用enum來(lái)保持類單例:
          // Enum singleton - the preferred approach
          public enum Elvis {
          INSTANCE;
          public void leaveTheBuilding()  }
          }
          除了它更簡(jiǎn)明,這種方式等同于public屬性方式。免費(fèi)提供了序列化機(jī)制,即使面對(duì)尖端的序列化或者反射攻擊,它都提供了堅(jiān)實(shí)的單例。
          結(jié)論:
          這種方式還需要廣泛的采納,
          元素級(jí)的單例枚舉類型是最好的實(shí)現(xiàn)單例的方法。
          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 一葉笑天 閱讀(375) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA技術(shù)
          主站蜘蛛池模板: 甘洛县| 保定市| 日喀则市| 定安县| 靖安县| 策勒县| 怀宁县| 万安县| 新蔡县| 平远县| 东莞市| 登封市| 合肥市| 烟台市| 永吉县| 通河县| 同心县| 江达县| 威远县| 奉化市| 宁蒗| 北流市| 娄烦县| 合水县| 普陀区| 靖边县| 盘锦市| 兴义市| 东光县| 治县。| 佛坪县| 东乌珠穆沁旗| 临澧县| 玉门市| 法库县| 濉溪县| 高唐县| 平和县| 花垣县| 吉水县| 平阳县|