锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成a人片在线观看日本麻豆,久久精品夜色噜噜亚洲A∨,在线亚洲午夜片AV大片http://m.tkk7.com/polygoncell/Finding... Thinking... Solving...zh-cnSun, 11 May 2025 04:39:17 GMTSun, 11 May 2025 04:39:17 GMT60浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/title><link>http://m.tkk7.com/polygoncell/archive/2008/08/04/219786.html</link><dc:creator>polygoncell</dc:creator><author>polygoncell</author><pubDate>Sun, 03 Aug 2008 19:48:00 GMT</pubDate><guid>http://m.tkk7.com/polygoncell/archive/2008/08/04/219786.html</guid><wfw:comment>http://m.tkk7.com/polygoncell/comments/219786.html</wfw:comment><comments>http://m.tkk7.com/polygoncell/archive/2008/08/04/219786.html#Feedback</comments><slash:comments>37</slash:comments><wfw:commentRss>http://m.tkk7.com/polygoncell/comments/commentRss/219786.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/polygoncell/services/trackbacks/219786.html</trackback:ping><description><![CDATA[鏈枃绱ф帴<a id="Editor_Results_rprSelectionList_ctl01_LinkTitle" class="titlelink" href="../archive/2008/08/04/219785.html">浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/a><br /> <br /> <span id="nb7o3" lang="EN-GB">涓婄瘒鏂囩珷璋堝埌濡備綍鑳藉褰誨簳鎶婅繖涓猻witch涔熺Щ闄ゆ帀鍛紵寰堢畝鍗曪紝鎴戜滑鍙渶瑕佸湪getSystemStatePerformer()鏂規硶琚皟鐢ㄤ箣鍓嶅厛鍒涘緩鎵鏈? performer鍖垮悕綾葷殑瀹炰緥錛岀劧鍚庡湪璇ユ柟娉曡璋冪敤鏃剁洿鎺ヨ繑鍥炲搴旂殑瀹炲姏銆?濡備綍鍏蜂綋瀹炵幇鍛紵 鐢∕ap錛?璇風湅浠g爜錛?br /> <br /> </span> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> de.jingge.refactoring.SystemState.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.Image;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.image.BufferedImage;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.lang.reflect.Method;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Collections;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.HashMap;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Map;<br /> <br />  <br /> <br /> </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br /> <br />  *<br /> <br />  * </span><span style="color: #808080;">@author</span><span style="color: #008000;"> gejing@gmail.com<br /> <br />  </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemStatePerformerFactory {<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemStatePerformerFactory INSTANCE </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemStatePerformerFactory();<br /> <br />    <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Map</span><span style="color: #000000;"><</span><span style="color: #000000;">SystemState, SystemStatePerformer</span><span style="color: #000000;">></span><span style="color: #000000;"> performers;<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SystemStatePerformerFactory() {<br /> <br /> }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemStatePerformerFactory getInstance() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> INSTANCE;<br /> <br />     }<br /> <br />    <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;"> Map</span><span style="color: #000000;"><</span><span style="color: #000000;">SystemState, SystemStatePerformer</span><span style="color: #000000;">></span><span style="color: #000000;"> getPerformers()<br /> <br />             </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br /> <br />         </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (performers </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br /> <br />             performers </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> HashMap</span><span style="color: #000000;"><</span><span style="color: #000000;">SystemState, SystemStatePerformer</span><span style="color: #000000;">></span><span style="color: #000000;">();<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> call all @FactoryMethod using reflection</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />             </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (Method m : getClass().getDeclaredMethods()) {<br /> <br />                 </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (m.getAnnotation(FactoryMethod.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">) </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br /> <br />                     SystemStatePerformer p </span><span style="color: #000000;">=</span><span style="color: #000000;"> (SystemStatePerformer) m.invoke(<br /> <br />                             </span><span style="color: #0000ff;">this</span><span style="color: #000000;">, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Object[]{});<br /> <br />                     performers.put(p.getState(), p);<br /> <br />                 }<br /> <br />             }<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> make it readonly</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />             performers </span><span style="color: #000000;">=</span><span style="color: #000000;"> Collections.unmodifiableMap(performers);<br /> <br />         }<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> performers;<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SystemStatePerformer getSystemStatePerformer(SystemState state) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception{<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> getPerformers().get(state);<br /> <br />     }<br /> <br />  <br /> <br /> @FactoryMethod<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SystemStatePerformer createLoggedInPerformer() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemStatePerformer(LOGGEDIN, getImage(</span><span style="color: #000000;">"</span><span style="color: #000000;">loggedin.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)) {<br /> <br />  <br /> <br />             @Override<br /> <br />             </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> perform() {<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after logging in is successful,<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: show welcome dialog, open the last edit document, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />             }<br /> <br />         };<br /> <br />     }<br /> <br />  <br /> <br /> @FactoryMethod<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SystemStatePerformer createLoggedOutPerformer() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemStatePerformer(LOGGEDOUT, getImage(</span><span style="color: #000000;">"</span><span style="color: #000000;">loggedout.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)) {<br /> <br />  <br /> <br />             @Override<br /> <br />             </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> perform() {<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after logging out is successful,<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: free used resource, dispose GUI components, etc.            }</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />             }<br /> <br />         };<br /> <br />     }<br /> <br />  <br /> <br /> @FactoryMethod<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SystemStatePerformer createIdlePerformer() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemStatePerformer(IDLE, getImage(</span><span style="color: #000000;">"</span><span style="color: #000000;">idle.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)) {<br /> <br />  <br /> <br />             @Override<br /> <br />             </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> perform() {<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after the user is idle,<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: save the application state temporarily, lock the application, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />             }<br /> <br />         };<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Image getImage(String string) {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedImage(</span><span style="color: #000000;">10</span><span style="color: #000000;">, </span><span style="color: #000000;">10</span><span style="color: #000000;">, BufferedImage.TYPE_4BYTE_ABGR);<br /> <br />     }<br /> <br /> }</span></div> <br /> <span id="u-921" lang="EN-GB">浠庝唬鐮佷腑鍙互鐪嬪嚭錛屽綋getPerformers錛堬級鏂規硶琚涓嬈¤皟鐢ㄦ椂錛屾垜浠細涓烘瘡涓涓猵erformer鍖垮悕綾誨垱寤轟竴涓疄渚嬶紝騫朵笖灝嗗畠浠撼鍏ap鐨勭 鐞嗕箣涓紝浠ュ悗姣忔璋冪敤鐨勬椂鍊欙紝鐩存帴浠嶮ap閲岄潰鎻愬彇瀵瑰簲鏌愪釜鐘舵佺殑performer灝卞彲浠ヤ簡錛?switch鍙互鑸嶅純浜嗐? @FactoryMethod榪欎釜娉ㄩ噴鏄垜鑷繁鍐欑殑錛屼嬌鐢ㄥ畠涓昏鏄負浜嗛伩鍏嶆瘡嬈℃柊澧炲姞涓涓猚reate***Performer錛堬級鏂規硶鍚庯紝閮藉繀欏諱慨鏀? getSystemStatePerformer錛堬級銆?br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br /> </span>@FactoryMethod鐨勪唬鐮佸涓嬶細<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.lang.annotation.ElementType;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.lang.annotation.Retention;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.lang.annotation.RetentionPolicy;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.lang.annotation.Target;<br /> <br />  </span><span style="color: #000000;"><br /> <br /> @Retention(RetentionPolicy.RUNTIME)<br /> <br /> @Target({ElementType.METHOD})<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> @</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> FactoryMethod {<br /> <br /> <br /> }</span></div> <br /> <span id="y.bf2078" lang="EN-GB">鍒拌繖閲屾暣涓噸鏋勫凡緇忕粨鏉熶簡錛?鎴戜滑宸茬粡灝唅f else, switch瀹屽叏浠庝唬鐮侀噷鍓旈櫎浜嗐?</span><br id="t4rh" /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br id="t4rh0" /> <p id="rhi73" class="MsoNormal"><span id="rhi74" lang="EN-GB">璇昏繃Refactoring to Patterns榪欐湰涔︾殑鏈嬪弸鍙兘浼氳寰楋紝榪欓噷鎵浣滅殑涓浜涘拰涔︿腑絎竷绔犳渶鍚庝竴鑺俁eplace Conditional Dispatcher with Command瀹屽叏涓鏍楓? Well錛岀涓鐪肩湅涓婂幓紜疄寰堝儚錛屼絾鏄湅瀹屾垜鍐欑殑鎵鏈変唬鐮佸悗錛屽啀浠旂粏鎯充竴鎯籌紝涓よ呰繕鏄湁鍖哄埆鐨勶紙</span><span id="de57" lang="EN-GB">Refactoring to Patterns榪欐湰涔﹀啓鐨勯潪甯稿ソ錛屽姝や功錛屾垜鍙互璇存槸鐖變笉閲婃墜錛岃繕鏇劇粡鍐欒繃涓綃囦功璇勩備簨瀹炰笂錛屾垜榪欑瘒鏂囩珷姝e紡鍩轟簬榪欐湰涔︾殑錛夛細</span></p> <p id="q75b2" class="MsoNormal"><span id="q75b3" lang="EN-GB">1. Factory + annonymous綾昏屼笉鏄瘡涓涓姸鎬佷竴涓叿浣撶殑瀹炰綋綾匯?/span></p> <p id="jg36" class="MsoNormal"><span id="jg360" lang="EN-GB">    榪欐牱澶勭悊闂錛?綾葷殑鏁伴噺澶уぇ鍑忓皯錛岀被鍏寵仈鐨勫鏉傜▼搴︿篃澶уぇ鍑忓皯錛岀淮鎶よ搗鏉ュ緢鏂逛究銆?/span></p> <p id="y13w" class="MsoNormal"><span id="y13w0" lang="EN-GB">2. performer騫朵笉鍗曞崟鏄竴涓猚ommand錛屽畠鎷ユ湁鐘舵侊紝騫朵笖鍙互澶勭悊鏇村鐨勯昏緫銆?/span></p> <br /> 鍏ㄦ枃瀹屻?br /> <img src ="http://m.tkk7.com/polygoncell/aggbug/219786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/polygoncell/" target="_blank">polygoncell</a> 2008-08-04 03:48 <a href="http://m.tkk7.com/polygoncell/archive/2008/08/04/219786.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/title><link>http://m.tkk7.com/polygoncell/archive/2008/08/04/219785.html</link><dc:creator>polygoncell</dc:creator><author>polygoncell</author><pubDate>Sun, 03 Aug 2008 19:08:00 GMT</pubDate><guid>http://m.tkk7.com/polygoncell/archive/2008/08/04/219785.html</guid><wfw:comment>http://m.tkk7.com/polygoncell/comments/219785.html</wfw:comment><comments>http://m.tkk7.com/polygoncell/archive/2008/08/04/219785.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/polygoncell/comments/commentRss/219785.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/polygoncell/services/trackbacks/219785.html</trackback:ping><description><![CDATA[鏈枃绱ф帴<a id="Editor_Results_rprSelectionList_ctl01_LinkTitle" class="titlelink" href="../archive/2008/08/04/219784.html">浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/a><br /> <br /> <p id="v:wh" class="MsoNormal"><span id="v:wh0" lang="EN-GB">OK, 鍒扮洰鍓嶄負姝紝鎵鏈夌殑閫昏緫浠g爜宸茬粡浠嶴ystemManager閲嶆瀯鍒頒簡SystemStatePerformer銆備笅涓姝ュ簲璇ョ戶緇噸鏋凷ystemManager錛?灝哠ystemState鏇挎崲涓簆erformer錛?/span></p> <p id="pw4b" class="MsoNormal"><span id="pw4b0" lang="EN-GB">1錛?浣跨敤IDE鐨勯噸鏋勫姛鑳斤紝灝嗗彉閲廠ystemState鏀逛負SystemStatePerformer</span></p> <p id="dz_e" class="MsoNormal"><span id="dz_e0" lang="EN-GB">2. 鍦╱pdateState()鏂規硶涓皟鐢⊿ystemStatePerformerFactory</span></p> <span id="hazn0" lang="EN-GB">3. 鍦ㄦ祴璇曚唬鐮侀噷闈紝璋冪敤manager.statePerformer.getState()</span><br id="nyha1" /> <br id="fljx" /> 閲嶆瀯鍚庣殑浠g爜濡備笅錛?br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> de.jingge.refactoring.SystemState.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> </span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemManager {<br /> <br />  <br /> <br />     SystemStatePerformer statePerformer;<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> login() {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call service#login()</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         updateState(LOGGEDIN);<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> logout() {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call service#logout()</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         updateState(LOGGEDOUT);<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> idle() {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call some other services</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         updateState(IDLE);<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> updateState(SystemState state) {<br /> <br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.statePerformer </span><span style="color: #000000;">=</span><span style="color: #000000;"> SystemStatePerformerFactory.getInstance()<br /> <br />                 getSystemStatePerformer(state);<br /> <br />         statePerformer.perform();<br /> <br />     }<br /> <br /> }</span></div> <br /> 鍙互鐪嬪埌if else宸茬粡娑堝け浜嗐?br id="nyha6" /> <br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br id="gflh" /> 嫻嬭瘯浠g爜涔熻鍋氱浉搴斾慨鏀癸細<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.AfterClass;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.BeforeClass;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.Test;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> org.junit.Assert.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> de.jingge.refactoring.SystemState.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> </span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemManagerTest {<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemManager manager;<br /> <br />     @BeforeClass<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setUpClass() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br /> <br />         manager </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemManager();<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> add some service mock objects</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />     }<br /> <br />     @AfterClass<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> tearDownClass() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br /> <br />     }<br /> <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> login() {<br /> <br />         manager.login();<br /> <br />         assertEquals(manager.statePerformer.getState(), LOGGEDIN);<br /> <br />     }<br /> <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> logout() {<br /> <br />         manager.logout();<br /> <br />         assertEquals(manager.statePerformer.getState(), LOGGEDOUT);<br /> <br />     }<br /> <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> idle() {<br /> <br />         manager.idle();<br /> <br />         assertEquals(manager.statePerformer.getState(), IDLE);<br /> <br />     }<br /> <br /> }</span></div> <br /> <p id="khlv0" class="MsoNormal"><span id="khlv1" lang="EN-GB">鍒拌繖閲岄噸鏋勫凡緇忓樊涓嶅瀹屾垚浜嗭紝浠g爜宸茬粡鏇村姞闈㈠悜瀵硅薄浜嗐傝繖閲岃繕鏈変竴涓皬闂錛屽湪factory閲岄潰榪樻湁涓涓猻witch錛岃繖涓拰if else鍏跺疄鏄病鏈夋湰璐ㄥ尯鍒殑錛屼篃灝辨槸璇磇f else騫舵病鏈夎瀹屽叏縐婚櫎鎺夈?br id="khlv2" /> </span></p> <br id="nb7o0" /> <span id="nb7o3" lang="EN-GB">閭d箞濡備綍鑳藉褰誨簳鎶婅繖涓猻witch涔熺Щ闄ゆ帀鍛紵寰堢畝鍗曪紝鎴戜滑鍙渶瑕佸湪getSystemStatePerformer()鏂規硶琚皟鐢ㄤ箣鍓嶅厛鍒涘緩鎵鏈? performer鍖垮悕綾葷殑瀹炰緥錛岀劧鍚庡湪璇ユ柟娉曡璋冪敤鏃剁洿鎺ヨ繑鍥炲搴旂殑瀹炲姏銆?閭d箞鍏蜂綋濡備綍瀹炵幇鍛紝璇風湅涓嬩竴綃囨枃绔?/span><a id="PostsList1_rpPosts_ctl00_TitleUrl" href="../archive/2008/08/04/219786.html">浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/a><span id="nb7o3" lang="EN-GB">銆?br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </span> <img src ="http://m.tkk7.com/polygoncell/aggbug/219785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/polygoncell/" target="_blank">polygoncell</a> 2008-08-04 03:08 <a href="http://m.tkk7.com/polygoncell/archive/2008/08/04/219785.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/title><link>http://m.tkk7.com/polygoncell/archive/2008/08/04/219784.html</link><dc:creator>polygoncell</dc:creator><author>polygoncell</author><pubDate>Sun, 03 Aug 2008 18:54:00 GMT</pubDate><guid>http://m.tkk7.com/polygoncell/archive/2008/08/04/219784.html</guid><wfw:comment>http://m.tkk7.com/polygoncell/comments/219784.html</wfw:comment><comments>http://m.tkk7.com/polygoncell/archive/2008/08/04/219784.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://m.tkk7.com/polygoncell/comments/commentRss/219784.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/polygoncell/services/trackbacks/219784.html</trackback:ping><description><![CDATA[鏈枃绱ф帴<a id="Editor_Results_rprSelectionList_ctl01_LinkTitle" class="titlelink" href="../archive/2008/08/04/219781.html">浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/a><br /> <strong><span style="font-size: 14pt;"><br /> 縐婚櫎if else<br /> </span></strong><br /> <p id="w9yc2" class="MsoNormal"><span id="w9yc3" lang="EN-GB">棣栧厛浠旂粏瑙傚療涓 涓媢pdateState()鏂規硶錛屾垜浠細鍙戠幇錛屽鑷磋鏂規硶鍐呭瓨鍦ㄥぇ閲廼f else鐨勫師鍥犳槸瀹冪殑鍙傛暟浠呬粎鏄竴涓猠num銆傜敱浜巈num鏈韓騫朵笉鍚湁浠諱綍閫昏緫浠g爜錛屽洜姝ゅ鑷村鐞唀num鐨勬柟娉曢渶瑕佷嬌鐢╥f else鏉ュ垎鏋恊num鐒跺悗璋冪敤鐩稿簲鐨勯昏緫銆傛槑鐧戒簡榪欎釜閬撶悊涔嬪悗錛岄噸鏋勭殑鏂瑰悜灝辨槑浜嗕簡銆傜畝鍗曠殑璇達紝鎴戜滑闇瑕佽灝嗘柟娉曞弬鏁扮敱enum鏇挎崲鎴愪竴涓洿鍔犲己澹殑鎶? 璞$被錛屾瘡涓涓戶鎵胯綾葷殑瀛愮被灝嗗叿浣撹礋璐e鐞嗕竴涓猠num瀹炰緥錛屼箣鍚庡啀灝唘pdateState錛堬級鏂規硶涓浉搴旂殑閫昏緫浠g爜杞Щ鍒拌繖浜涘瓙綾諱腑銆傝繖鏍峰鐞嗕箣鍚庯紝 浠や漢璁ㄥ帉鐨刬f else灝變細娑堝け浜嗐?br id="w9yc4" /> </span></p> <p id="y.bf844" class="MsoNormal"><span id="y.bf845" lang="EN-GB"><br id="hfer" /> </span></p> <span id="hfer1" lang="EN-GB">鎴戜滑灝嗚繖涓浛鎹num鐨勬娊璞$被鍛藉悕涓篠ystemStatePerformer錛屼唬鐮佸涓嬶細<br /> <br /> </span> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.Image;<br /> </span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">abstract</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemStatePerformer {<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">final</span><span style="color: #000000;"> SystemState state;<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Image image;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SystemStatePerformer(SystemState state, Image image) {<br /> <br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.state </span><span style="color: #000000;">=</span><span style="color: #000000;"> state;<br /> <br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.image </span><span style="color: #000000;">=</span><span style="color: #000000;"> image;<br /> <br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> SystemState getState() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> state;<br /> <br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Image getImage() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> image;<br /> <br />     }<br />     <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">abstract</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> perform();<br /> <br /> }</span></div> <br /> <p id="gaic0" class="MsoNormal"><span id="gaic1" lang="EN-GB">浠庝唬鐮佷腑鍙互鐪嬪嚭錛屾瘡 涓涓猵erformer閮藉惈涔夋湁涓涓猄ystemState錛岃繖涓猄ystemState灞炴э紝灝嗗彧鑳介氳繃鏋勫緩鍣ㄦ槧灝勬柟寮忓皠鍏ヤ竴涓猵erformer鐨勫 璞″疄渚嬨傛崲鍙ヨ瘽璇碨ystemState鍙槸涓涓彧璇誨睘鎬э紝鑰屼笖姣忎竴涓猵erformer瀹炰綋綾婚兘鍙礋璐e鐞嗕竴涓猠num鐨勫疄渚嬶紙涓嬮潰椹笂浼氳В閲婂浣曞疄鐜? 鐨勶級銆傝繖閲屼嬌鐢ㄧ殑Image浣滀負涓涓緥瀛愶紝瀹冭〃紺虹敤鎴風殑姣忎竴涓姸鎬侀兘鍙互浣跨敤涓涓浘鏍囨潵琛ㄧず銆俻erformer()鏂規硶灝嗚礋璐e鐞嗗叿浣撶殑閫昏緫銆傝繖涓? SystemStatePerformer鐨勫疄浣撳瓙綾誨彲浠ュ紩鐢ㄤ換浣曠被鍨嬬殑瀵硅薄錛岀劧鍚庡湪perform錛堬級鏂規硶閲岄潰榪涜璋冪敤銆?<br id="gaic2" /> </span></p> <br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br /> <br id="xwuj" /> <span id="zvtj1" lang="EN-GB">涓? 涓姝ュ氨鏄紪鍐橲ystemStatePerformer鐨勫疄浣撳瓙綾匯傛垜棣栧厛鎯沖埌鐨勬槸涓烘瘡涓涓猠num瀹炰緥緙栧啓涓涓疄闄呯殑瀛愮被錛岀悊璁轟笂鏉ヨ鏄病闂鐨勶紝浣嗘槸 榪欐牱鍋氬繀欏葷紪鍐欎竴澶у爢鐨勫瓙綾伙紝涓嶄究浜庣鐞嗐傛墍浠ユ垜鍐沖畾浣跨敤Factory + annonymous classes鏉ユ瀯寤哄叿浣撶殑瀹炰綋瀛愮被錛岃Factory鏉ョ鐞嗘墍鏈夌殑瀹炰綋瀛愮被銆?/span> 浠g爜濡備笅錛?br id="xwuj0" /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> de.jingge.refactoring.SystemState.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.Image;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.awt.image.BufferedImage;<br /> </span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemStatePerformerFactory {<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemStatePerformerFactory INSTANCE </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemStatePerformerFactory();<br /> <br />    <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SystemStatePerformerFactory() {<br /> <br /> }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemStatePerformer getSystemStatePerformer(SystemState state) {<br /> <br />         </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (state) {<br /> <br />             </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> LOGGEDIN:<br /> <br />                 </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> createLoggedInPerformer();<br /> <br />             </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> IDLE:<br /> <br />                 </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> createIdlePerformer();<br /> <br />             </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> LOGGEDOUT:<br /> <br />                 </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> createLoggedOutPerformer();<br /> <br />             </span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br /> <br />                 </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> IllegalAccessError(</span><span style="color: #000000;">"</span><span style="color: #000000;">Unkonw status</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> <br />         }<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemStatePerformer createLoggedInPerformer() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemStatePerformer(LOGGEDIN, getImage(</span><span style="color: #000000;">"</span><span style="color: #000000;">loggedin.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)) {<br /> <br />  <br /> <br />             @Override<br /> <br />             </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> perform() {<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after logging in is successful,<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: show welcome dialog, open the last edit document, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />             }<br /> <br />         };<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemStatePerformer createLoggedOutPerformer() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemStatePerformer(LOGGEDOUT, getImage(</span><span style="color: #000000;">"</span><span style="color: #000000;">loggedout.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)) {<br /> <br />  <br /> <br />             @Override<br /> <br />             </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> perform() {<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after logging out is successful,<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: free used resource, dispose GUI components, etc.            }</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />             }<br /> <br />         };<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemStatePerformer createIdlePerformer() {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemStatePerformer(IDLE, getImage(</span><span style="color: #000000;">"</span><span style="color: #000000;">idle.gif</span><span style="color: #000000;">"</span><span style="color: #000000;">)) {<br /> <br />  <br /> <br />             @Override<br /> <br />             </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> perform() {<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after the user is idle,<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: save the application state temporarily, lock the application, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />             }<br /> <br />         };<br /> <br />     }<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> Image getImage(String string) {<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedImage(</span><span style="color: #000000;">10</span><span style="color: #000000;">, </span><span style="color: #000000;">10</span><span style="color: #000000;">, BufferedImage.TYPE_4BYTE_ABGR);<br /> <br />     }<br /> <br /> }</span></div> <br /> <p id="lvu93" class="MsoNormal"><span id="lvu94" lang="EN-GB">浠? 浠g爜涓彲浠ョ湅鍒幫紝閽堝姣忎竴涓猠num鐘舵侀兘鏈変竴涓垱寤簆erformer鐨勬柟娉曪紝璇ユ柟娉曡繑鍥炰竴涓尶鍚嶇被銆傞昏緫浠g爜灝嗕細琚漿縐昏嚦涓尶鍚嶇被鐨? perform()鏂規硶涔嬪唴銆傛暣涓狥actory鍙湁涓涓叕寮鐨勬柟 娉曪細getSystemStatePerformer(SystemState)錛孲ystemManager鍙互璋冪敤榪欎釜鏂規硶鏉ヨ幏寰楃浉搴旂殑 Performer瀹炰緥銆?br id="lvu95" /> </span></p> <br /> <span id="aofb3" lang="EN-GB">鍦? 榪欑瘒鏂囩珷涓紝鎴戝笇鏈涗笓灞炰簬if else鐨勯棶棰樸傚浜庡叾浠栬璁℃柟闈㈢殑闂錛屾垜閲囧彇鐨勬佸害鏄兘鐪佺暐灝辯渷鐣ャ傚疄闄呭紑鍙戜腑錛岃繕鏈夋湁寰堝闂闇瑕佸鐞嗭紝渚嬪錛屼嬌鐢╯tatic鏂規硶浼氬鑷寸郴緇熺殑鍙? 嫻嬭瘯鎬т笅闄嶏紝鍦ㄥ疄闄呭紑鍙戜腑搴旇灝介噺閬垮厤錛岃В鍐寵繖綾婚棶棰樼殑鏂規硶涔嬩竴鏄嬌鐢―I妗嗘灦錛屼緥濡侴oogle Guice銆?/span><br /> <br /> 涓嬩竴綃囨枃绔?a id="Editor_Results_rprSelectionList_ctl01_LinkTitle" class="titlelink" href="../archive/2008/08/04/219785.html">浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/a>緇х畫璁茶В銆?br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <img src ="http://m.tkk7.com/polygoncell/aggbug/219784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/polygoncell/" target="_blank">polygoncell</a> 2008-08-04 02:54 <a href="http://m.tkk7.com/polygoncell/archive/2008/08/04/219784.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/title><link>http://m.tkk7.com/polygoncell/archive/2008/08/04/219781.html</link><dc:creator>polygoncell</dc:creator><author>polygoncell</author><pubDate>Sun, 03 Aug 2008 18:45:00 GMT</pubDate><guid>http://m.tkk7.com/polygoncell/archive/2008/08/04/219781.html</guid><wfw:comment>http://m.tkk7.com/polygoncell/comments/219781.html</wfw:comment><comments>http://m.tkk7.com/polygoncell/archive/2008/08/04/219781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/polygoncell/comments/commentRss/219781.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/polygoncell/services/trackbacks/219781.html</trackback:ping><description><![CDATA[鏈枃绱ф帴<a id="Editor_Results_rprSelectionList_ctl01_LinkTitle" class="titlelink" href="../archive/2008/08/04/219780.html">浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/a>銆?br /> <br /> <strong>浣跨敤Enum鏇挎崲int甯擱噺</strong><br /> <br /> 榪欎竴姝ユ瘮杈冪畝鍗曪紝鍏堝垱寤轟竴涓猠num綾伙細<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">enum</span><span style="color: #000000;"> SystemState {<br /> <br />     LOGGEDIN,<br /> <br />     LOGGEDOUT,<br /> <br />     IDLE;<br /> <br /> }</span></div> <br /> <br id="i7km192" /> 鐒跺悗寮濮嬮噸鏋凷ystemManager, 浣跨敤SystemState浠f浛SystemManager閲岀殑int鐘舵侊細<br id="i7km193" /> <br id="i7km194" />    1. 娣誨姞 import static de.jingge.refactoring.SystemState.*;<br id="i7km195" />    2. 鍒犻櫎鎵鏈夌殑integer甯擱噺   <br id="i7km196" />    3. 灝嗗彉閲弒tate鐨勭被鍨嬫敼涓篠ystemState.<br id="i7km197" /> <br id="i7km198" /> 浠g爜濡備笅錛?br /> <br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> de.jingge.refactoring.SystemState.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemManager {<br /> <br />     SystemState state;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> login() {<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call service#login()</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        updateState(LOGGEDIN);<br />     }<br />    <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> logout() {<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call service#logout()</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        updateState(LOGGEDOUT);<br />     }<br />    <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> idle() {<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call some other services</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        updateState(IDLE);<br />     }<br />    <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> updateState(SystemState state) {<br />         </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (state </span><span style="color: #000000;">==</span><span style="color: #000000;"> LOGGEDIN) {<br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after logging in is successful,<br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: show welcome dialog, open the last edit document, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (state </span><span style="color: #000000;">==</span><span style="color: #000000;"> LOGGEDOUT) {<br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after logging out is successful,<br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: free used resource, dispose GUI components, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (state </span><span style="color: #000000;">==</span><span style="color: #000000;"> IDLE) {<br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after the user is idle,<br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: save the application state temporarily, lock the application, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {<br />             </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> IllegalArgumentException(</span><span style="color: #000000;">"</span><span style="color: #000000;">unknown state</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         }<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.state </span><span style="color: #000000;">=</span><span style="color: #000000;"> state;<br />     }<br /> }<br /> </span></div> <br /> 鐒跺悗閲嶆瀯嫻嬭瘯綾?<br id="i7km244" /> <br id="i7km245" /> 1.    娣誨姞import static de.jingge.refactoring.SystemState.*;<br id="i7km246" /> 2.    鍒犻櫎鎵鏈夊父閲忓墠寮曠敤鐨凷ystemManager.<br id="i7km247" /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.AfterClass;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.BeforeClass;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.Test;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> org.junit.Assert.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> de.jingge.refactoring.SystemState.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> <br /> </span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemManagerTest {<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemManager manager;<br /> <br />     @BeforeClass<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setUpClass() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br />         manager </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemManager();<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> add some service mock objects</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    }<br />    <br />     @AfterClass<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> tearDownClass() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br />     }<br />    <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> login() {<br />         manager.login();<br />         assertEquals(manager.state, LOGGEDIN);<br />     }<br />   <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> logout() {<br />         manager.logout();<br />         assertEquals(manager.state, LOGGEDOUT);<br />     }<br /> <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> idle() {<br />         manager.idle();<br />         assertEquals(manager.state, IDLE);<br />     }<br /> }<br /> </span></div> <br /> <br id="ja7w" /> 榪愯榪欎釜嫻嬭瘯綾?>閫氳繃<br id="ja7w0" /> <br id="ja7w1" /> 涓嬩竴綃囨枃绔?a id="Editor_Results_rprSelectionList_ctl01_LinkTitle" class="titlelink" href="../archive/2008/08/04/219784.html">浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/a>寮濮嬪鐞唅f else hell<br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <img src ="http://m.tkk7.com/polygoncell/aggbug/219781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/polygoncell/" target="_blank">polygoncell</a> 2008-08-04 02:45 <a href="http://m.tkk7.com/polygoncell/archive/2008/08/04/219781.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/title><link>http://m.tkk7.com/polygoncell/archive/2008/08/04/219780.html</link><dc:creator>polygoncell</dc:creator><author>polygoncell</author><pubDate>Sun, 03 Aug 2008 18:36:00 GMT</pubDate><guid>http://m.tkk7.com/polygoncell/archive/2008/08/04/219780.html</guid><wfw:comment>http://m.tkk7.com/polygoncell/comments/219780.html</wfw:comment><comments>http://m.tkk7.com/polygoncell/archive/2008/08/04/219780.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/polygoncell/comments/commentRss/219780.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/polygoncell/services/trackbacks/219780.html</trackback:ping><description><![CDATA[鎴戜滑鐭ラ亾鍥犱負緙栫▼璇█鐨勯檺鍒訛紝鍘嗗彶閬楃暀涓嬫潵鐨勭郴緇熸繪槸鏈夊緢澶氱殑姣涚梾錛屼笉澶熼潰鍚戝璞★紝灝ゅ叾鏄緢澶氱郴緇熸互鐢╥f else銆傛垜鏇劇粡瑙佽繃涓涓」鐩紝澶у鍩烘湰涓婂氨鏄啓涓涓柟娉曪紝鐒跺悗鍦ㄩ噷闈f else濂梚f esle寰楀祵濂椾簡濂藉嚑灞傦紝闅劇湅灝變笉蹇呰浜嗭紝榪欑浠g爜鏍規湰灝辨病娉曠淮鎶ゃ?br id="i7km" /> <br id="i7km0" /> 浠婂ぉ鎴戝氨浣跨敤浠庡疄闄呴」鐩腑鎻愮偧鍑烘潵鐨勪緥瀛愭潵璁茶В涓涓嬪浣曞皢榪欑被浠g爜鍙樺緱鏇村姞闈㈠悜瀵硅薄 - 閲嶆瀯鎴愭ā寮忓茍涓旀坊鍔犳祴璇曚唬鐮侊紝 <br id="i7km1" /> <br id="i7km2" /> 鍏堟潵鐪嬩竴涓笐闄嬬殑綾伙細<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br />  <br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemManager {<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">final</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> LOGGEDIN </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">final</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> LOGGEDOUT </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">final</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> IDLE </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;">;<br /> <br />     </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> state;<br /> <br />  <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> login() {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call service#login()</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         updateState(LOGGEDIN);<br /> <br />     }<br /> <br />    <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> logout() {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call service#logout()</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         updateState(LOGGEDOUT);<br /> <br />     }<br /> <br />    <br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> idle() {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> call some other services</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         updateState(IDLE);<br /> <br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> updateState(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> state) {<br /> <br />         </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (state </span><span style="color: #000000;">==</span><span style="color: #000000;"> LOGGEDIN) {<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after logging in is successful,<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: show welcome dialog, open the last edit document, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (state </span><span style="color: #000000;">==</span><span style="color: #000000;"> LOGGEDOUT) {<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after logging out is successful,<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: free used resource, dispose GUI components, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (state </span><span style="color: #000000;">==</span><span style="color: #000000;"> IDLE) {<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> do something after the user is idle,<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> for example: save the application state temporarily, lock the application, etc.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {<br /> <br />             </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> IllegalArgumentException(</span><span style="color: #000000;">"</span><span style="color: #000000;">unknown state</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> <br />         }<br /> <br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.state </span><span style="color: #000000;">=</span><span style="color: #000000;"> state;<br /> <br />     }<br /> <br /> }</span></div> <br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <br /> 榪欓噷鎴戜滑灞曠ず浜嗕竴涓?SystemManager錛屽畠璐熻矗澶勭悊鐢ㄦ埛鍦ㄧ郴緇熶腑鐨勭姸鎬侊細鐧誨叆錛坙ogged in錛夛紝鐧誨嚭錛坙ogged out錛?浠ュ強絀洪棽錛坕dle錛夈備粠浠g爜涓彲浠ョ湅鍒幫紝榪欎釜綾葷敤浜唅nt鏉ュ畾涔夌姸鎬佸茍涓斿洜姝ゅ鑷翠簡updatteState錛堬級鏂規硶閲岄潰鍑虹幇澶ч噺if else銆備粠鐩墠鐪嬫潵榪欎簺if else鏄棤娉曢伩鍏嶇殑錛屽簲涓鴻繖涓被闇瑕侀拡瀵逛笉鍚岀殑鐘舵佷綔鍑哄弽搴斻傞殢鐫鐘舵佺殑澧炲姞錛宨f else鐨勬暟閲忎篃浼氱戶緇鍔犮傝繖涓В鍐蟲柟妗堟樉鐒跺緢宸?br id="i7km87" /> <br id="i7km88" /> 閭d箞鎬庝箞鏍鋒墠鑳借榪欎釜綾繪洿鍔犲湴闈㈠悜瀵硅薄鍛紵<br id="i7km89" /> <br id="i7km90" /> 鍦ㄥ鐞嗛潰鍚戝璞′箣鍓嶏紝鎴戜滑棣栧厛瑕佺紪鍐欎竴涓祴璇曠被錛岃繖涔熸槸澶勭悊榪欑被鍘嗗彶閬楃暀涓嬫潵浠g爜鎵蹇呴渶鍋氱殑絎竴姝ワ紝鍙湁鍦ㄦ祴璇曚唬鐮佺殑淇濇姢涓嬶紝鎴戜滑鎵嶈兘鏀懼績澶ц儐鍦拌繘琛岄噸鏋勩?br id="i7km91" /> <br id="i7km92" /> 鍒濇鐨勬祴璇曚唬鐮佸涓嬶細<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">package</span><span style="color: #000000;"> de.jingge.refactoring;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.AfterClass;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.BeforeClass;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> org.junit.Test;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> org.junit.Assert.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> <br /> </span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> SystemManagerTest {<br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> SystemManager manager;<br /> <br />     @BeforeClass<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setUpClass() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br />         manager </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> SystemManager();<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> add some service mock objects</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    }<br /> <br />     @AfterClass<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> tearDownClass() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br /> <br />     }<br /> <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> login() {<br /> <br />         manager.login();<br /> <br />         assertEquals(manager.state, SystemManager.LOGGEDIN);<br /> <br />     }<br /> <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> logout() {<br /> <br />         manager.logout();<br /> <br />         assertEquals(manager.state, SystemManager.LOGGEDOUT);<br /> <br />     }<br /> <br />     @Test<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> idle() {<br /> <br />         manager.idle();<br /> <br />         assertEquals(manager.state, SystemManager.IDLE);<br /> <br />     }<br /> <br /> }</span></div> <br /> 榪愯嫻嬭瘯浠g爜->閫氳繃銆?br id="i7km171" /> <br id="i7km172" /> 鍦ㄤ笅涓綃囨枃绔犳垜浠皢姝e紡寮濮嬮噸鏋勩傚湴鍧錛?a title="浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛? target="_blank" href="http://m.tkk7.com/polygoncell/archive/2008/08/04/219781.html">浣跨敤閲嶆瀯縐婚櫎涓戦檵鐨刬f else浠g爜錛?錛?/a><br /> <script type="text/javascript"><!-- google_ad_client = "pub-7331426433126513"; /* 728x90, created 7/11/08 */ google_ad_slot = "1570738323"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <img src ="http://m.tkk7.com/polygoncell/aggbug/219780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/polygoncell/" target="_blank">polygoncell</a> 2008-08-04 02:36 <a href="http://m.tkk7.com/polygoncell/archive/2008/08/04/219780.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涔﹁瘎錛?Refactoring to Patternhttp://m.tkk7.com/polygoncell/archive/2008/07/29/218513.htmlpolygoncellpolygoncellTue, 29 Jul 2008 11:17:00 GMThttp://m.tkk7.com/polygoncell/archive/2008/07/29/218513.htmlhttp://m.tkk7.com/polygoncell/comments/218513.htmlhttp://m.tkk7.com/polygoncell/archive/2008/07/29/218513.html#Feedback0http://m.tkk7.com/polygoncell/comments/commentRss/218513.htmlhttp://m.tkk7.com/polygoncell/services/trackbacks/218513.html
鏈榪戦槄璇葷殑涔﹀茍涓嶉兘鏄渶鏂扮殑錛屽洜涓轟簺涔︾殑紜槸闇瑕佽姳鏃墮棿鍙嶅鐮旇錛屼粩緇嗘濊冪殑錛屼緥濡傚叧浜庤璁℃ā寮忕殑涔︺?br id="tt2t" />
Refactoring to Patterns灝辨槸榪欐牱涓鏈功錛屼竴鏈浉瀵規潵璇翠笉綆楀お鏂扮殑涔︼紝涓鏈叧浜庤璁℃ā寮忕殑涔︼紝涓鏈浜轟粠鏂板紑濮嬫濊冩ā寮忕殑涔︺傛垜鏈漢寮虹儓鎺ㄤ婦澶у闃呰銆?br id="x6op" />
榪欐湰涔﹀垰鍑烘潵鐨勬椂鍊欙紝鎴戝氨涓鐩存兂濂藉ソ闈欎笅蹇冩潵璇諱竴璇伙紝鏃犲宸ヤ綔蹇欑錛屼竴鐩存病鏈夋壘鍒版満浼氥傝屼笖璇村疄璇濓紝鑷繁瀵硅璁℃ā寮忎篃宸茬粡嫻告帆鏁拌澆錛屽ぇ閮ㄥ垎妯″紡閮藉凡緇忓湪瀹? 闄呴」鐩腑鍘嗙粌榪囷紝涓嶈鐐夌伀綰潚錛屼篃綆楀緱涓婃槸鐔熻兘鐢熷閥銆傝櫧鐒剁煡閬撹繖鏄竴鏈ソ涔︼紝浣嗘槸蹇冮噷渚濈劧浼氭硾璧烽樀闃墊稛婕細just another design pattern book錛岀粰鎴戜竴澶╂椂闂達紝鎴戝氨鑳芥妸瀹冩嬁涓嬨傛病鎯沖埌浠庡紑濮嬭鍒扮幇鍦ㄥ凡緇?涓鏈堜簡錛岀幇鍦ㄤ緷鐒朵細鎶芥椂闂村嚭鏉ョ炕鐪嬫煇涓珷鑺傦紝鐒跺悗緇撳悎瀹為檯闂浠旂粏鎬濊冧竴鐣傝瀹? 璇濓紝璁捐妯″紡鐪熺殑鏄釜濂戒笢瑗匡紝鏄墠杈堢粡楠岀殑縐瘡錛屼絾鏄綋鎴戜滑鐔熺粌鎺屾彙浜嗗悇縐嶆ā寮忎箣鍚庯紝灝變細閬囧埌涓や釜鐡墮鎬ц川鐨勯棶棰橈細

1. 濡備綍灝嗗悇綾繪ā寮忚瀺姹囪瘡閫氥傛劅瑙夊氨鍍忔槸姝︿緺閲岄潰鐨勫浣曞皢浠葷潱浜岃剦鎵撻氾紝鍔熷か鍐嶅ソ錛屼換鐫d簩鑴変笉閫氫篃闈為珮鎵嬶紝涓嶅悓鐨勬ā寮忕浉浜掍綔鐢ㄤ細浜х敓涓嶅悓鐨勭粨鏋滐紝涓嶅悓鐨勬ā寮忕粍鍚堜細浜х敓涓嶅悓鐨勭粨鏋勶紝鎴栫浉浜掕ˉ鍏呯浉浜掍績榪涳紝鎴栦簰鐩稿獎鍝嶄簰鐩告姷鍒躲傚浣曢夋嫨錛屾槸涓毦棰樸?br id="ifwv" />
2. 濡備綍閬垮厤榪囧害璁捐銆傛ā寮忕敤鐔熺殑鏈嬪弸鍙兘浼氭湁榪欑鎰熻錛岀紪紼嬬殑鏃跺欎細涓嶇煡涓嶈涓嬌鐢ㄦā寮忚繘琛屽紑鍙戯紝妯″紡鍐嶅ソ錛屾硾婊ヤ嬌鐢紝榪囩姽涓嶅強銆傚ソ鍍忔鍔熶竴鑸紝鎷涘紡綣佸錛屽浐鐒惰嶈搗鏉ュソ鐪嬶紝浣嗘槸楂樻墜鏈鍚庣殑澧冪晫寰寰鏄棤鎷涜儨鏈夋嫑錛屽彧瑕佽兘鐩殑杈懼埌灝辮浜嗐?br id="i:83" />
絎竴涓棶棰樼敱浜庢ā寮忎箣闂寸殑緇勫悎鍗冨彉涓囧寲錛岃屼笖寰堝闇瑕佺粨鍚堝疄闄呴棶棰樿繘琛岃冭檻錛屽ぇ瀹跺彧鑳芥槸鍦ㄥ疄闄呴」鐩紑鍙戜腑鎱㈡參浣撲細錛屾參鎱㈢Н绱粡楠屻傛垨璁稿啀榪囧嚑騫翠細鏈夋煇涓漢鎴栬呮煇浜涗漢鎶婅繖浜涚粡楠屾敹闆嗘暣鐞嗭紝緙栨帓鍑轟功銆?br id="p99i" />
浠婂ぉ涓昏鎯寵璇寸浜屼釜闂錛氳繃搴﹁璁°?Refactoring to Patterns榪欐湰涔﹀氨鏄府鍔╂垜浠敖閲忛伩鍏嶈繃搴﹁璁$殑錛岃繖涔熸槸鎴戞帹鑽愬ぇ瀹剁湅榪欐湰涔︾殑鍒濊》銆?br id="jar4" />
浜嬪疄涓婏紝榪欐湰涔﹀畬鍏ㄥ彲浠ョ湅鎴愭槸鏋侀檺緙栫▼緋誨垪閲岄潰鐨勪竴閮ㄥ法澶磋憲浣滐紝鍏朵粬鐨勯噸瑕佽憲浣滃寘鎷琓DD錛孯efactoring錛屽拰continuous integration錛屽悎璧鋒潵搴旇縐頒負XP鍥涘ぇ閲戝垰銆?br id="f4g2" />
浣跨敤XP寮鍙戝己璋僰eep it simple錛屽湪緙栫爜鐨勬椂鍊欓鍏堢敤鏈綆鍗曠殑鍔炴硶瀹炵幇鍔熻兘(褰撶劧鏈濂芥槸嫻嬭瘯椹卞姩,鎴戜細鍦ㄨ瘎璁轟笅闈竴鏈功鏄戶緇皥嫻嬭瘯椹卞姩錛夛紝鐒跺悗鍦ㄦ祴璇曚唬鐮佺殑淇濇姢涓嬪鍒濈駭浠? 鐮佽繘琛屽ぇ鍒闃旀枾鍦伴噸鏋勶紝榪欐椂鍊欒繖浜涗唬鐮佽嚜鐒舵渶濂借兘澶熼噸鏋勬垚璁捐妯″紡錛屽洜涓洪拡瀵規煇浜涚壒瀹氱殑闂錛屾ā寮忓熀鏈笂鏄渶浣寵В鍐蟲柟妗堛傝繖涓椂鍊欏氨澶у灝遍渶瑕佷簡瑙e浣曞皢 鐜版湁鐨勪唬鐮侀噸鏋勬垚涓烘爣鍑嗙殑璁捐妯″紡浠g爜錛岃鐨勪弗閲嶇偣錛岃繖涓姝ュ叧緋誨埌鏁翠釜浠g爜鐨勮川閲忥紝鐩磋嚦寮曠敵鍒扮湡涓」鐩殑璐ㄩ噺銆傝繖鏈功灝遍拡瀵硅繖涓叧閿楠よ繘琛屼簡璁茶В錛屾槸鎵 鏈夐噰鐢╔P鏂規硶鐨勫紑鍙戝洟闃熺殑蹇呬慨璇句箣涓銆?br id="w11_" />

鑷充簬涔︾殑鍐呭鎴戝氨灝介噺綆鍗曟鎷竴涓嬶細鏈功鍩烘湰涓婅鐩栦簡閲嶆瀯欏圭洰涓細閬囧埌鐨勫ぇ閮ㄥ垎闂錛屽茍涓旈拡瀵硅繖浜涢棶棰樻彁渚涗簡瀹炰緥璁茶В鍜屽叿浣撶殑瑙e喅鏂規銆傝繖浜涙柟妗堜笉鍗曞崟閫? 鐢ㄤ簬浣跨敤TDD寮鍙戠殑欏圭洰錛屽畠浠洿閫傜敤浜庨偅浜涘笇鏈涢氳繃閲嶆瀯鏀瑰杽鐜版湁浠g爜璐ㄩ噺鐨勯」鐩傚綋鐒訛紝閲嶆瀯鍓嶏紝鍗冧竾鍒皾璇曢伩寮緙栧啓嫻嬭瘯浠g爜錛岃鐗㈣錛屾病鏈夋祴璇曚唬鐮佷繚 鎶わ紝鏈濂戒笉瑕佸浠g爜鍋氬ぇ鎵嬫湳銆備功涓殑寰堝渚嬪瓙閮藉煎緱澶у璇誨畬浠ュ悗緇撳悎鑷繁鐨勫疄闄呴」鐩粩緇嗘濊冧竴鐣傛垜涓漢寰堝枩嬈㈢7绔狅紝宸茬粡鍦ㄩ」鐩腑閲囩敤浜嗕功涓彁鍒扮殑寰堝 瑙e喅鏂規錛屽茍涓斿浜庢煇浜涘疄闄呬緥瀛愶紝寮濮嬪皾璇曚紭鍖栦功涓殑鏂規錛屽笇鏈涗互鍚庤兘澶熸娊鍑烘椂闂存潵鍐欎竴綃囪緇嗙殑鍗氭枃銆?

polygoncell 2008-07-29 19:17 鍙戣〃璇勮
]]>
Swing閫氱敤鏁版嵁楠岃瘉妯″潡http://m.tkk7.com/polygoncell/archive/2008/07/29/218508.htmlpolygoncellpolygoncellTue, 29 Jul 2008 10:27:00 GMThttp://m.tkk7.com/polygoncell/archive/2008/07/29/218508.htmlhttp://m.tkk7.com/polygoncell/comments/218508.htmlhttp://m.tkk7.com/polygoncell/archive/2008/07/29/218508.html#Feedback5http://m.tkk7.com/polygoncell/comments/commentRss/218508.htmlhttp://m.tkk7.com/polygoncell/services/trackbacks/218508.html 榪欐鏃墮棿鐪熸槸蹇欏緱瑕佹錛屼竴鏂歸潰瑕佸紑鍙戝叕鍙擱」鐩殑緋葷粺妗嗘灦錛岃灝嗛」鐩垎鎴愪笉鍚岀殑瀛愰」鐩紝緙栧啓鏍稿績浠g爜錛涘彟涓鏂歸潰瑕佸皢鏋侀檺緙栫▼錛圶P錛夊紩鍏ュ洟闃熷紑鍙戯紝閮ㄧ講鍚勭被 XP闇瑕佺殑鏈嶅姟渚嬪subversion鍟︼紝ant+ivy鍟︼紝Hudson鍟︾瓑絳夈傞『渚胯鍙ラ澶栬瘽錛寀buntu榪樼湡鏄笉鏄竴鑸殑濂界敤錛屽緩璁湁鑳藉姏鐨勫叏 閮ㄨ漿鍒皍buntu涓婂幓寮鍙戙?

鎴戠洰鍓嶅紑鍙戠殑榪欎釜妗嗘灦鐨勫鎴風鏄叿鑲ョ殑瀹㈡埛绔紝涔熷氨鏄疭wing瀹㈡埛绔簡銆係wing搴旂敤鐩稿浜嶹eb搴旂敤鏈夊緢澶氫紭鍔匡紝鍥犱負瀹冩洿鑲ャ傛暟鎹獙璇佸氨鏄? 鍏朵腑涓涓傚綋鐒剁幇鍦ㄧ殑Web搴旂敤閫氳繃浣跨敤Ajax涔熻姣斾互鍓嶅己寰堝浜嗭紝浣嗘槸榪樻槸閬垮厤涓嶄簡鍦ㄩ獙璇佹暟鎹椂鍚戞湇鍔℃鍙戝嚭璇鋒眰錛岃嚦灝戜綘鏃犳硶閬垮厤楠岃瘉緇撴灉浠嶹eb鏈? 鍔″櫒浼犺緭鍒扮敤鎴鋒祻瑙堝櫒涓婅繖孌佃繃紼嬨傝孲wing榪欑被鑲ュ鎴風鍙互瀹炵幇瀹屽叏鍦ㄦ湰鍦板鏁版嵁榪涜楠岃瘉錛岀敋鑷沖彲浠ユ柇緗戠戶緇伐浣滐紙榪欎篃鏄疻eb搴旂敤鐩墠鍦ㄧ爺鍙戠殑涓涓? 閲嶈璇鵑錛夈?

鍓嶆鏃墮棿寮鍙戝嚭浜嗕竴涓彲浠ュ簲鐢ㄤ簬鎵鏈塖wing搴旂敤鐨勯氱敤鏁版嵁楠岃瘉妯″潡錛屽彂鐜板畠鍦ㄩ」鐩腑浣跨敤鍚庯紝瀵逛簬鏅氱殑鏁版嵁楠岃瘉,紼嬪簭鍛樺嚑涔庝笉闇瑕佺紪鐮侊紝鏁堢巼鎻愰珮浜嗕笉灝戯紝灝卞啓浜嗕竴綃囧崥鏂囨嬁鍑烘潵鍜屽ぇ瀹跺垎浜傚師鏂囨槸鐢ㄨ嫳鏂囧啓鐨勶紝鍦ㄨ繖閲岋細http://polygoncell.blogspot.com/2008/07/validation-module-for-swing-application.html銆傝嫳鏂囧ソ鐨勬湅鍙嬪彲浠ョ洿鎺ュ幓閭i噷鐪嬨?

緙栧啓榪欎釜妯″潡浣跨敤浜嗗緢澶氫笉鍚岀殑寮婧愭鏋跺拰綾誨簱錛屽叾涓緢閲嶈鐨勪竴涓氨鏄疛XLayer銆傛枃绔犲啓瀹屽悗錛屾垜灝辮窇鍘婚個璇稪XLayer鐨勪綔鑰匒lexp鏉ユ寚鐐逛竴涓嬶紝鐒跺悗灝卞湪鎴戠殑鏂囩珷鍚庨潰寮濮嬩簡涓孌佃璁猴紝鎸烘湁鎰忔濈殑錛屼粬涓嶆劎涓烘槸Swing team閲岄潰鐨勭墰浜哄晩錛佸帀瀹沖晩錛佸懙鍛點?

ok錛屽洖鍒頒粖澶╄繖綃囨枃绔犵殑姝i銆備粖澶╃殑涓昏鐩殑鏄皢鎴戠殑鑻辨枃鍗氭枃緲昏瘧鎴愪腑鏂囷紙鑷繁鐨勬枃绔狅紝鎴戝氨涓嶉愬瓧閫愬彞緲昏瘧浜嗭紝鎰忔濆埌浜嗗氨琛屼簡錛屽彲鑳借繕浼氶殢鍏村睍 寮涓鐣璁猴級鍦ㄨ繖閲屽睍紺虹粰澶у錛屼笌澶у鍒嗕韓寮鍙戠粡楠岋紝甯屾湜澶у鑳藉浠庝腑鑾風泭錛屼篃甯屾湜鑳藉浠ユ枃浼氬弸錛屽箍浜ゆ湅鍙嬨傚簾璇濆皯璇達紝鍒囧叆姝i銆?

鏁版嵁楠岃瘉錛圴alidation錛変竴鐩存槸杞歡寮鍙戜腑闈炲父閲嶈鐨勪竴鐜紝鏈変簡瀹冿紝浣犵殑緋葷粺浼氳瀹㈡埛鎰熷埌鏇村姞鍙嬪杽錛屽悓鏃朵綘鐨勭郴緇熶篃寰楀埌浜嗕竴瀹氱▼搴︾殑淇? 鎶ゃ備竴鑸潵璇達紝鏁版嵁楠岃瘉鏃㈠彲浠ュ湪瀹㈡埛绔篃鍙互鍦ㄦ湇鍔$銆傞粯璁ょ殑JSF鏁版嵁楠岃瘉灝辨槸鍦ㄦ湇鍔$錛屾暟鎹彧鑳藉湪琚彁浜や互鍚庢墠鑳藉琚獙璇侊紝鐒跺悗鎶婇敊璇俊鎭紶閫掑洖鐢ㄦ埛 鐨勬祻瑙堝櫒銆傚悗鏉ュぇ瑙勬ā浣跨敤Ajax鍚庯紝鍩烘湰鍙互瀹炵幇瀵逛慨鏀圭殑鏁版嵁“鍗蟲椂”楠岃瘉錛屾敞鎰忚繖閲屾槸涓墦浜嗗紩鍙風殑鍗蟲椂錛屾暟鎹簨瀹炰笂榪樻槸瑕佸湪嫻忚鍣ㄥ拰鏈嶅姟绔箣闂磋繘琛屼紶 閫掔殑錛屽彧涓嶈繃Ajax灝嗚繖縐嶄紶閫掓敼涓洪殣寮忎簡鑰屽凡錛岀悊璁轟笂騫舵病鏈夌湡姝e疄鐜幫紙鏂綉錛夊嵆鏃墮獙璇併傝屽湪Swing搴旂敤涓婂氨鑳藉杈炬垚榪欑鎰挎湜銆?

浜嬪疄涓婏紝寮鍙慡wing搴旂敤鏃訛紝鏁版嵁楠岃瘉涓鐩存瘮杈冩鎵嬶紝闇瑕佹墜宸ョ紪鐮佺殑鍦版柟澶錛屾晥鐜囦笉楂樸傚悗鏉ュ嚭浜咼Goodies Validation 緇撳悎JGoodies binding鍚庯紝濂戒簡涓浜涖傝繖涓狫Goodies Validation鏃㈠彲浠ュ疄鐜癿odel灞傞潰鐨勯獙璇侊紝涔熷彲浠ュ疄鐜癇ean灞傞潰鐨勯獙璇侊紝浣嗘槸澶氬勾浣跨敤涓嬫潵錛屽彂鐜板叾瀹炲畠姣旇緝閫傜敤浜庝腑灝忛」鐩紝鑰屼笖瑕佺紪鍐欑殑浠? 鐮佸叾瀹炰竴鐐逛笉姣旇嚜宸辨墜鍔ㄧ紪鍐欑殑灝戙?

JGoodies嫻佽浜嗕竴孌墊椂闂村悗錛宻un寮濮嬫帹鍑鴻嚜宸辯殑bean緇戝畾鏂規錛歜eansbinding錛圝SR 295錛夛紝鎴戜釜浜烘劅瑙夎姣擩Goodies binding濂界敤錛圝Goodies鐨勪綔鑰匥arsten涔熷湪涓撳緇勯噷錛岃繖涓漢鎴戜互鍓嶅拰浠栦竴璧峰叡浜嬭繃錛屾垜鐨刴sn space閲岄潰榪樻湁璺熶粬鐨勫悎褰憋紝緇濆鏄疭wing鐣岀殑鐗涗漢錛夈傝繖涓猙eansbinding涔熸彁渚涙暟鎹獙璇侊紝浣嗘槸瀹冪殑榪欎釜鏁版嵁楠岃瘉鍙槸鍦╰arget琚敼 鍔ㄥ悗錛屾暟鎹鍚屾鍥瀞ource涔嬪墠鎵嶄細璧蜂綔鐢紝浣跨敤璧鋒潵灞闄愭ф瘮杈冨ぇ錛岃屼笖緙栫爜閲忎篃涓嶅皬銆?

鐢變簬鐩墠緇濆ぇ閮ㄥ垎欏圭洰鏄熀浜嶱OJO鐨勶紝Hibernate validator宸茬粡鎻愪緵浜嗕竴涓緢濂界殑鏁版嵁楠岃瘉妗嗘灦錛屾垜浠畬鍏ㄦ病蹇呰鍐嶉噸澶嶅彂鏄庤疆瀛愶紝鎴戜滑搴旇鍔姏绔欏湪宸ㄤ漢鐨勮偐鑶涓婏紝榪欐牱鎴戜滑鎵嶈兘绔欏緱鏇撮珮錛岀湅寰楁洿榪溿? 浜庢槸鎴戣冭檻緇撳悎beansbinding鍜孒ibernate Validator寮鍙戞暟鎹獙璇併傝繕鏈変竴涓噸瑕佺殑闂錛岄偅灝辨槸鏁版嵁閿欒鐨勬椂鍊欙紝闇瑕佸湪鐢ㄦ埛鐣岄潰涓婂睍紺虹浉搴旂殑淇℃伅錛屼緥濡侲rror icon鍜岄敊璇彁紺猴紝榪欓儴鍒嗘垜鑰冭檻浣跨敤JXLayer銆?

浣犲彲浠ュ湪濡備笅閾炬帴涓壘鍒扮浉鍏蟲鏋剁殑鍏蜂綋淇℃伅錛?

1. Hibernate Validator錛?http://www.hibernate.org/hib_docs/validator/reference/en/html_single/
2. Beansbinding: https://beansbinding.dev.java.net/
3. JXlayer: http://weblogs.java.net/blog/alexfromsun/

闃呰榪欑瘒鏂囩珷錛屼笉闇瑕佷綘鐔熸倝榪欎簺綾誨簱錛屼笉榪囦簡瑙h繖浜涚被搴撹兘澶熷府鍔╀綘鏇村ソ鍦扮悊瑙h繖綃囨枃绔犮?

鎴戠殑榪欎釜閫氱敤妯″潡鏄弬鑰僇XLayer閲岄潰鐨勪竴涓猟emo綾籘extValidationDemo鐨勶紝榪欎釜JXlayer鏄敱Alexander Potochkin寮鍙戠殑錛屾垜寰堝枩嬈紝浣跨敤璧鋒潵寰堥『鎵嬶紝寮虹儓鎺ㄨ崘浣跨敤銆?

涓嬮潰寮濮嬩粙緇嶄唬鐮併傞鍏堟槸寤虹珛涓涓猨ava欏圭洰錛屽浜庤繖涓皬欏圭洰錛屾垜浣跨敤netbeans銆傝繖閲岃鍙ラ澶栬瘽錛屼腑鍨嬪拰澶у瀷鐨凷wing搴旂敤錛屽緩璁渶 濂借繕鏄笉瑕佷嬌鐢╪etbeans鐨凣UI Builder錛屼竴鏂歸潰瀹冪敓鎴愮殑浠g爜瓚呯駭鐑傦紝鍙︿竴鏂歸潰寰堥毦嫻嬭瘯銆傜洰鍓嶅競闈笂鏈夊緢澶氬ソ鐢ㄧ殑layout鐨勬鏋訛紝渚嬪 JGoodies form鍜孧igLayout錛屽紑鍙戞晥鐜囩粷瀵逛笉姣攏etbeans鐨凣UI builder宸紝浣犺繕涓嶉渶瑕侀潰瀵逛護浜哄ご鐤肩殑鏈哄櫒鎴愮殑浠g爜銆?

欏圭洰鍒涘緩濂藉悗錛屽姞鍏ョ被搴擄細



鐒跺悗鍐欎竴涓猵ersistence bean:
package de.jingge.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;


@Entity
public class Country extends AbstractBean {

private static final long serialVersionUID = 5341382564159667599L;
public static final String PROPERTYNAME_NAME = "name";
public static final String PROPERTYNAME_CODE = "code";
private String name;
private String code;
private Long id;

public Country() {
}

public Country(String code, String name) {
    
super();
    setCode(code);
    setName(name);
}

@Id
@GeneratedValue(strategy 
= GenerationType.AUTO)
public Long getId() {
    
return id;
}

public void setId(Long id) {
    
this.id = id;
}

@NotEmpty
public String getName() {
    
return name;
}

public void setName(String name) {
    firePropertyChange(PROPERTYNAME_NAME, 
this.name, this.name = name);
}

@Length(min
=2, max= 2, message="Code length must be 2")
@NotEmpty
public String getCode() {
    
return code;
}

public void setCode(String code) {
    firePropertyChange(PROPERTYNAME_CODE, 
this.code, this.code = code);
}
}


榪欓噷鎴戜負浜嗗己璋冨彲浠ュ湪Swing瀹㈡埛绔洿鎺ヤ嬌鐢ㄥ拰楠岃瘉persistence bean錛屾晠鎰忓啓浜嗕竴涓猵ersistence bean錛屽疄闄呭簲鐢ㄤ腑錛岃繖涓被鍙渶瑕佹槸涓涓猵ojo灝辮浜嗐?

榪欎釜Country綾諱唬琛ㄤ竴涓浗瀹訛紝瀹冩湁涓や釜灞炴э紝code鍜宯ame錛屾垜緇欎粬浠垎鍒姞涓婁釜鍚勮嚜鐨勯獙璇侀檺鍒躲俢ode涓嶈兘涓虹┖錛屼笖蹇呴』姝eソ鏄袱涓? 瀛楃錛屼緥濡侰N錛孌E錛孶S銆俷ame涓嶈兘涓虹┖銆傝繖浜沘nnotaion鍧囧嚭鑷狧ibernate Validator銆傞偅涓埗綾籄bstractBean鍑鴻嚜SwingX綾誨簱錛屾垜浠殑Country綾葷戶鎵夸簡瀹冧箣鍚庡氨鍙互鏀寔property change event浜嗐?

ok, 涓嬮潰鍙互寮濮嬬紪鍐欒繖涓ā鍧楃殑鏍稿績浠g爜浜嗐傚墠闈㈣榪囷紝鎴戜細浣跨敤JXlayer銆備嬌鐢ㄥ畠鐨勫ソ澶勬槸錛氭墍鏈塉Xlayer鐨刾ainting event閮戒細琚漿鍒癠I綾繪潵錛屾垜浠彧闇瑕佺紪鍐欎竴涓泦鎴怘ibernate Validator鐨刄I綾誨氨鍙互浜嗭紝鎴戠О榪欎釜綾諱負HibernateValidationUI錛屼唬鐮佸涓嬶細

package de.jingge.view;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.text.JTextComponent;

import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;
import org.jdesktop.beansbinding.ELProperty;
import org.jdesktop.beansbinding.PropertyStateEvent;
import org.jdesktop.beansbinding.PropertyStateListener;
import org.jdesktop.jxlayer.JXLayer;
import org.jdesktop.jxlayer.plaf.AbstractLayerUI;

/**
* Header:
* Description: A layerUI which will validate the referenced property value of
* the object each time when the paint() method is called.

* The value of the given object property will be observed.
* Note: This UI works only with {
@link JXLayer}. Any change of the property
* will force repainting the UI. The work process looks like: property changed ->
* jxlayer will be repainted -> the paint() method of this UI will be called.
* The logic of validation will be handled by the Hibernate validator
* framework.
*
*/
public class HibernateValidationUI extends AbstractLayerUI<jTextComponent> {

private Object object;
private String propertyName;
private ClassValidator validator;
private ELProperty elProperty;
private PropertyStateListener propertyChangeHandler;

public HibernateValidationUI(Object obj, String propertyName) {
    
this.object = obj;
    
this.propertyName = propertyName;
    propertyChangeHandler 
= new PropertyChangeHandler();
    validator 
= new ClassValidator(obj.getClass());

    elProperty 
= ELProperty.create("${" + propertyName + "}");
}

public void installUI(JComponent c) {
    
super.installUI(c);
    elProperty.addPropertyStateListener(object, propertyChangeHandler);
}

public void uninstallUI(JComponent c) {
    
super.uninstallUI(c);
    elProperty.removePropertyStateListener(object, propertyChangeHandler);
}

protected void paintLayer(Graphics2D g2, JXLayer<jTextComponent> l) {
    
super.paintLayer(g2, l);
    InvalidValue[] validationMessages 
= validator.getInvalidValues(object,
            propertyName);
    
if (validationMessages.length > 0) {
        BufferedImage image 
= Java2DIconFactory.createErrorIcon();
        g2.drawImage(image, l.getWidth() 
- image.getWidth() - 1,
                l.getHeight() 
- 8null);
        l.getView().setToolTipText(validationMessages[
0].getMessage());

        
return;
    }
    l.getView().setToolTipText(
null);
}

boolean isValid() {
    
return validator.getInvalidValues(object, propertyName).length == 0;
}

class PropertyChangeHandler implements PropertyStateListener {

    @Override
    
public void propertyStateChanged(PropertyStateEvent pse) {
        setDirty(
true);
    }
}
}



榪欎釜HibernateValidationUI綾誨彧鏈変竴涓瀯寤哄櫒錛屽畠鎺ユ敹涓や釜鍙傛暟錛屼竴涓槸source object錛屼篃灝辨槸鎴戜滑瑕佷慨鏀圭殑閭d釜Bean綾葷殑瀹炰緥錛屽彟澶栦竴涓槸榪欎釜bean鐨勪竴涓睘鎬э紝榪欎釜HibernateValidationUI灝辮礋璐i獙璇佽繖涓睘鎬с?

鍦╥nstallUI()鏂規硶涓紝鎴戜滑鍚姩瀵瑰睘鎬у彉鍖栫殑瑙傚療綾伙紝鑰屽湪uninstallUI()鏂規硶閲岄潰錛屾垜浠渶瑕佸嵏杞借繖涓瀵熺被銆?

褰撶粰瀹氬璞$殑灞炴у煎彂鐢熷彉鍖栨椂錛孭ropertyChangeHandler鐨刾ropertyStateChanged錛堬級鏂規硶灝變細琚皟鐢紝榪? 涓姛鑳芥槸閫氳繃elProperty鍜孭ropertzChangeHandler鐩哥粨鍚堟潵瀹炵幇鐨勩傚湪propertyStateChangeed()鏂規硶 閲孶I綾葷殑鏂規硶setDirty()浼氳璋冪敤錛岃鏂規硶鐨勮皟鐢ㄤ細瀵艱嚧UI綾葷殑鐘舵佸彉鍖栵紝榪涜屽紩鍙?re)painting錛屼箣鍚庣粡榪囦竴緋誨垪鐨勬柟娉曡皟鐢ㄤ紶 閫掞紝paintLayer(Graphics2D g2, JXLayer<jTextComponent> l)榪欎釜鏂規硶灝嗕細琚皟鐢紝榪欎釜鏂規硶瑕佸仛鐨勫氨鏄垜浠繖涓暟鎹獙璇佹ā鍧楃殑鏍稿績鍔熻兘錛?

1. 璋冪敤Hibernate Validator楠岃瘉璇ュ睘鎬с?
2. 濡傛灉鏁版嵁涓嶆紜紝鍒欏湪GUI涓婃樉紺轟竴涓猠rror icon錛屽茍涓斿皢閿欒淇℃伅浣滀負tooltip灞曠ず緇欑敤鎴楓?

鍦ㄧ浜岀偣閲岄潰浜х敓浜嗕竴涓棶棰橈紝璋㈣阿Alexp瀵規垜鐨勬寚鐐廣係wing team閲岄潰鏈変竴浜涜瀹氾紝鍏朵腑涔嬩竴灝辨槸錛屽湪paint()鏂規硶閲岄潰鏈濂戒笉瑕佹敼鍙楥omponent鐨勭姸鎬侊紝鑰宻etTooltip()鏂規硶灝嗕細鏀瑰彉 component鐨勭姸鎬侊紝鍥犳闇瑕佸湪paint()鏂規硶涔嬪璋冪敤銆傛垜鐩墠浣跨敤涓嬫潵錛岃繕娌℃湁鍙戠幇浠涔堜弗閲嶇殑閿欒錛屽喅瀹氭殏鏃朵笉鏀逛簡錛屽洖澶存湁鏃墮棿鍦ㄥ皢榪欎釜浠g爜 緲繪柊涓涓嬨?

綾諱腑鐢ㄥ埌鐨凧ava2DIconFactory浠g爜濡備笅錛?

package de.jingge.view;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;


public class Java2DIconFactory {

public static BufferedImage createErrorIcon() {
    
return createErrorIcon(78);
}

public static BufferedImage createErrorIcon(int width, int height) {
    BufferedImage icon 
= new BufferedImage(width, height,
            BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 
= (Graphics2D) icon.getGraphics();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
            RenderingHints.VALUE_STROKE_PURE);
    g2.setColor(Color.RED);
    g2.fillRect(
00, width, height);
    g2.setColor(Color.WHITE);
    g2.drawLine(
00, width, height);
    g2.drawLine(
0, height, width, 0);
    g2.dispose();
    
return icon;
}
}


娌′粈涔堝お澶氬ソ瑙i噴鐨勶紝灝辨槸浣跨敤Java 2D鐢諱竴涓狤rror icon銆?

鎺ョ潃錛屾垜浠渶瑕佺紪鍐欎竴涓狥actory綾伙紝鏋勫緩涓涓狫TextField錛屽敖閲忔妸澶嶆潅鎶鏈皝瑁呰搗鏉ワ紝榪欐牱紼嬪簭鍛樺紑鍙戣搗鏉ュ彲浠ユ彁楂樻晥鐜囷紝浠g爜濡備笅錛?

package de.jingge.view;

import javax.swing.JTextField;
import javax.swing.text.JTextComponent;
import org.jdesktop.beansbinding.AutoBinding;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.beansbinding.Bindings;
import org.jdesktop.beansbinding.ELProperty;
import org.jdesktop.jxlayer.JXLayer;
import static org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.*;


public class GuiComponentFactory {

public static JXLayer<jTextComponent> createTextField(
        BindingGroup bindingGroup, Object sourceObject,
        String sourceProperty) {
    JTextField field 
= new JTextField();
    AutoBinding binding 
= Bindings.createAutoBinding(READ_WRITE,
            sourceObject, ELProperty.create(
"${" + sourceProperty + "}"),
            field, BeanProperty.create(
"text"));
    bindingGroup.addBinding(binding);
    bindingGroup.bind();
    
return new JXLayer<jTextComponent>(field, new HibernateValidationUI(
            sourceObject, sourceProperty));
}
}


createTextField()鏂規硶涓昏灝嗙粰瀹氬璞″睘鎬х殑鍊間笌JTextField鐨則ext緇戝畾錛岀劧鍚庡皢JTextField綰沖叆鍒? JXLayer鐨勭鐞嗕箣涓嬨傝繖鏍蜂竴鏉ワ紝涓鏃︾敤鎴峰湪JTextField閲岄潰淇敼鏁版嵁錛岃繖涓敼鍙樺氨浼氬悓姝ュ埌璇ュ璞″睘鎬т笂錛岀劧鍚庡氨寮曞彂浜嗗墠闈㈡弿榪扮殑涓緋誨垪閫? 杈戯紝鏈緇堟敼鍙樼殑鏁版嵁灝變細琚獺iberante Validator鍔犱互楠岃瘉銆?

鏈鍚庯紝鎴戜滑鍙互緙栧啓涓涓狣emo application鏉ョ湅鐪嬫晥鏋滃浣曪紝浠g爜濡備笅錛?

package de.jingge.main;

import de.jingge.domain.Country;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.JTextComponent;
import net.miginfocom.swing.MigLayout;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.jxlayer.JXLayer;
import static de.jingge.view.GuiComponentFactory.*;


public class ValidationApplicaton {

private BindingGroup bg;
private Country country;
private JXLayer<jTextComponent> codeField;
private JXLayer<jTextComponent> nameField;

/**
 * 
@param args the command line arguments
 
*/
public static void main(String[] args) {
    
try {
        UIManager.setLookAndFeel(
                
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    } 
catch (UnsupportedLookAndFeelException ex) {
        System.err.println(
                
"Nimbus L&F does not support. Default L&F will be used.");
    } 
catch (ClassNotFoundException e) {
        
// TODO Auto-generated catch block
        e.printStackTrace();
    } 
catch (InstantiationException e) {
        
// TODO Auto-generated catch block
        e.printStackTrace();
    } 
catch (IllegalAccessException e) {
        
// TODO Auto-generated catch block
        e.printStackTrace();
    }
    ValidationApplicaton app 
= new ValidationApplicaton();
    JFrame frame 
= new JFrame("Demo Validation Application");
    frame.setPreferredSize(
new Dimension(360150));
    frame.getContentPane().add(app.buildPanel(), BorderLayout.CENTER);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setCenter(frame);
    frame.setVisible(
true);
    frame.pack();

}

private static void setCenter(JFrame frame) {
    Toolkit toolkit 
= Toolkit.getDefaultToolkit();
    Dimension screenSize 
= toolkit.getScreenSize();

    
// Calculate the frame location
    int x = (screenSize.width - (int) frame.getPreferredSize().getWidth()) / 2;
    
int y = (screenSize.height - (int) frame.getPreferredSize().getHeight()) / 2;

    
// Set the new frame location
    frame.setLocation(x, y);
}

public ValidationApplicaton() {
    country 
= new Country();
    bg 
= new BindingGroup();
}

private JPanel buildPanel() {

    codeField 
= createTextField(bg, country, Country.PROPERTYNAME_CODE);
    nameField 
= createTextField(bg, country, Country.PROPERTYNAME_NAME);
    JPanel panel 
= new JPanel(new MigLayout("",
            
"[50px, right]10[200px:250px:300px]""[center]"));
    panel.add(
new JLabel("Code:"), "cell 0 0");
    panel.add(codeField, 
"cell 1 0, w 200px:250px:300px");
    panel.add(
new JLabel("Name:"), "cell 0 1");
    panel.add(nameField, 
"cell 1 1, w 200px:250px:300px");
    
return panel;
}
}


榪欎釜綾繪瘮杈冪畝鍗曚簡錛屾垜綆鍗曡В閲婁竴涓嬶細

鍦╩ain()鏂規硶閲岄潰錛屾垜浠垱寤轟簡涓涓狫Frame錛岀劧鍚庢斁鍏ヤ竴涓狫Panel

setCenter()鏂規硶璐熻矗灝嗙獥鍙h嚦浜庡睆騫曠殑姝d腑闂淬?

鍦ㄦ瀯寤哄櫒閲岄潰錛屾垜浠垱寤轟簡Country鍜孊indingGroup鐨勫璞″疄渚嬨?

鍦╞uildPanel()鏂規硶閲岄潰錛屾垜浠嬌鐢∕igLayout鏋勫緩浜嗕竴涓狿anel錛屽叾涓璫odeField鍜宯ameField瀵瑰簲鍚勮嚜鐨勫璞″睘鎬с傛洿澶氬叧浜嶮igLayout鐨勪俊鎭湅榪欓噷錛?a target="_blank">http://www.miglayout.com/銆傝繖涔熸槸涓涓緥瀛愶紝澶у鍙互鐪嬪埌浣跨敤MigLayout寮鍙慡wing鐪熺殑鏄潪甯告柟渚褲?

浠庤繖涓狣emo閲岄潰涔熷彲浠ョ湅鍑猴紝緙栧啓濂絧ojo鍚庯紝紼嬪簭鍛樺彧闇瑕佽皟鐢╟reateTextField(bg, country, Country.PROPERTYNAME_CODE); 灝卞彲浠ュ垱寤轟竴涓敮鎸佹暟鎹獙璇佺殑JTextField錛岀紪鐮侀噺宸茬粡鍙互璇存槸鏈澶ч檺搴︾殑闄嶄綆浜嗐?

榪愯紼嬪簭錛屼綘浼氱湅鍒幫細



榪欎釜code鍜宯ame鐨勬暟鎹兘涓嶅悎娉曪紝鐢ㄦ埛鐪嬪埌浜唀rror icon銆?

灝嗛紶鏍囩Щ鍒癟ext field涓婏紝浣犱細鐪嬪埌錛?



濉ソ鍚堟硶鏁版嵁鍚庯紝Error icon灝變笉瑙佷簡錛?



鎬葷粨錛?

浣跨敤榪欎釜閫氱敤鏁版嵁楠岃瘉妯″潡鏈夊緢澶氬ソ澶勶細

1. 濡傛灉欏圭洰浣跨敤ORM錛屼緥濡侶ibernate錛岃繖涓柟妗堝簲璇ユ槸瑙e喅鏁版嵁楠岃瘉鐨勬渶濂芥柟妗堜箣涓銆?
2. 瀵逛簬鏅氱殑鏁版嵁楠岃瘉錛屼緥濡傞潪絀猴紝email錛岄暱搴︾瓑絳夛紝紼嬪簭鍛樻牴鏈笉闇瑕佺紪鐮侊紝鍙鍦≒OJO涓婁嬌鐢ㄧ浉搴旂殑Hibernate Validator annotation灝卞彲浠ヤ簡銆?
3. 瀵逛簬澶嶆潅鐨勬暟鎹獙璇侊紝Hibernate Validator鎻愪緵浜嗗緢濂界殑鎵╁睍鏈哄埗錛屽彧瑕佸啓涓涓猘nnotation澶栧姞涓涓猇alidator灝卞彲浠ヤ簡銆係wing搴旂敤榪欒竟浠嶇劧涓嶉渶瑕佺紪鍐欎換浣曚唬鐮併?

緇間笂鎵榪幫紝鍙互鐪嬪嚭閫氳繃浣跨敤榪欎釜閫氱敤鏁版嵁楠岃瘉妯″潡錛屽紑鍙戞晥鐜囦細鎻愰珮寰堝銆?


polygoncell 2008-07-29 18:27 鍙戣〃璇勮
]]>
customer enumhttp://m.tkk7.com/polygoncell/archive/2008/03/29/189386.htmlpolygoncellpolygoncellFri, 28 Mar 2008 16:58:00 GMThttp://m.tkk7.com/polygoncell/archive/2008/03/29/189386.htmlhttp://m.tkk7.com/polygoncell/comments/189386.htmlhttp://m.tkk7.com/polygoncell/archive/2008/03/29/189386.html#Feedback0http://m.tkk7.com/polygoncell/comments/commentRss/189386.htmlhttp://m.tkk7.com/polygoncell/services/trackbacks/189386.html
鍦ㄤ笂涓綃囧崥瀹腑錛屾垜鐨別num鏄繖涔堝啓鐨勶細

public enum Status implements DescriptionID {

    ACTIVATED(
5"This object is activated"),  
    DEACTIVATED(
9"This object is deactivated");

    
private Integer id;
    
private String description;
    
private static List<Status> list;

    
static {
        list 
= new ArrayList<Status>(2);
        list.add(ACTIVATED);
        list.add(DEACTIVATED);
    }

    
private Status(int statusNr, String description) {
        
this.id = statusNr;
        
this.description = description;
    }

    
public String getDescription() {

        
return this.description;
    }

    
public Integer getId() {
        
return id;
    }

    
public static List<Status> getAll() {
        
return list;
    }

    
public static Status findById(Integer id) {
        
for (Status status : getAll()) {
            
if (id == status.getId()) {
                
return status;
            }
        }
        
return null;
    }

}

鍏朵腑涓や釜static鏂規硶鏄負浜嗘柟渚夸嬌鐢ㄣ?br />
緙虹偣涓錛?br />
         鎵鏈夌殑enum瀹炰緥蹇呴』鎵嬪姩綰沖叆list闆嗗悎涓?br />
瑙e喅鏂規硶錛?
 
        瑙e喅鏂規硶闈炲父綆鍗曪紝鏄敤Class綾繪彁渚涚殑鏂規硶getEnumConstants()錛?浠g爜濡備笅錛?br />
    public static List<Status> getAll() {
        
return Arrays.asList(Status.class.getEnumConstants());
    }

鎴戜釜浜烘瘮杈冭鍘屾暟緇勶紝鍥犳榪欓噷鐗規剰灝嗘暟緇勮漿鎹㈡垚List銆傚鏋滀綘浠笉浠嬫剰浣跨敤鏁扮粍鐨勮瘽錛実etAll錛堬級鏂規硶瀹屽叏鍙互鐪佺暐銆?br />
緙虹偣浜岋細

           findById(Integer id) 鏂規硶鍚嶅茍涓嶈創鍒囷紝鍙玤etEnumById(Integer id)浼氭洿濂戒簺銆傚彟澶栦竴妯′竴鏍風殑鏂規硶蹇呴』鍦ㄦ瘡涓涓猠num綾諱腑閲嶅緙栧啓錛屽鏋滄煇涓湴鏂歸渶瑕佹敼鍔紝閭e氨闇瑕佹敼鍔ㄦ墍鏈夌浉鍏崇殑enum綾伙紝榪欐槸涓涓緢鏄庢樉鐨刡ad smell銆?br />
瑙e喅鏂規硶錛?br />
        緙栧啓涓涓猽til綾伙紝灝嗛昏緫杞Щ鍒皍til綾諱腑錛実etEnumById(Integer id)鏂規硶璋冪敤util綾諱腑鐨勭浉鍏蟲柟娉曪紝浠g爜濡備笅錛?br />
    public static Status getEnumById(Integer id) {
        
return EnumUtils.getEnum(Status.class, id);
    }

public class EnumUtils {

    
public static <extends DescriptionID> I getEnum(Class<I> type, int id) {
        I[] types 
= type.getEnumConstants();
        
for (I t : types) {
            
if (t.getId() == id)
                
return t;
        }
        return null;

    }
}

榪欓噷getEnum(Class<I> type, int id)鏂規硶鍒╃敤Java 5鐨勬柊鐗規eneric,鍒╃敤緇欏畾鐨凜lass鍜宔num id錛岃繑鍥炲搴旂殑enum瀹炰緥銆傝繖鏍峰鐞嗗ソ澶勫緢鏄庢樉錛岃幏鍙杄num瀹炰緥鐨勯昏緫浠g爜鍙瓨鍦ㄤ笌util綾諱腑錛屾棩鍚庝慨鏀瑰崄鍒嗘柟渚褲?br />
鐩稿叧鍐呭璇峰弬闃?span style="color: #000000;">鎴戝啓鐨?a target="_blank" title="銆奌ibernate 3鍜孞ava Persistence API 紼嬪簭寮鍙戜粠鍏ラ棬鍒扮簿閫氥? >銆奌ibernate 3鍜孞ava Persistence API 紼嬪簭寮鍙戜粠鍏ラ棬鍒扮簿閫氥?/a>涓涔︺?/span>


polygoncell 2008-03-29 00:58 鍙戣〃璇勮
]]>
Hibernate user typehttp://m.tkk7.com/polygoncell/archive/2008/03/21/187788.htmlpolygoncellpolygoncellFri, 21 Mar 2008 12:14:00 GMThttp://m.tkk7.com/polygoncell/archive/2008/03/21/187788.htmlhttp://m.tkk7.com/polygoncell/comments/187788.htmlhttp://m.tkk7.com/polygoncell/archive/2008/03/21/187788.html#Feedback4http://m.tkk7.com/polygoncell/comments/commentRss/187788.htmlhttp://m.tkk7.com/polygoncell/services/trackbacks/187788.html銆奌ibernate 3鍜孞ava Persistence API 紼嬪簭寮鍙戜粠鍏ラ棬鍒扮簿閫氥?/a>錛屼功涓潃閲嶄粙緇嶄簡鍦℉ibernate/JPA涓嬌鐢ˋnnotation銆傛渶榪戞湁璇昏呮潵淇¤闂甎serType錛屽啀鍔犱笂鏈榪戠湅鍒版湁鐨勪漢鍦ㄩ」鐩腑婊ョ敤Hibernate鐨剈ser type錛屾兂鍦ㄨ繖閲岃鍑犲彞銆?br />
浣跨敤UserType棣栧厛瑕佸紕娓呮瀹冪殑鐩殑銆傚ぇ瀹剁煡閬揌ibernate瑙e喅鐨勪富瑕佹槸瀵硅薄鏁版嵁搴撻樆鎶楀け琛$殑闂錛屼篃灝辨槸濡備綍灝嗕竴涓垨澶氫釜瀵硅薄淇濆瓨鍒頒竴涓垨澶氫釜鏁版嵁搴撹〃鏍間腑銆傝繖鍏朵腑鏈夊緢澶氭柟娉曪紝鍏跺疄澶ч儴鍒嗘儏鍐典笅閲囩敤@Embeddable鍜?/tt>@Embedded灝卞彲浠ヨВ鍐抽棶棰樹簡錛屽彧鏈夊祵鍏ュ璞℃柟寮忔棤娉曟弧瓚寵姹傛椂錛屾垨鑰呮槸Hibernate榛樿鐨勬寔涔呭寲鏂瑰紡鏃犳硶婊¤凍瑕佹眰鏃訛紝鎵嶅簲璇ヨ冭檻UserType銆傛諱箣璁頒綇涓涓師鍒欙紝涓嶅埌灞辯┓姘村敖錛屼笉瑕佽交鏄撲嬌鐢║serType銆傝繕鏈変竴涓鎱庨噸鑰冭檻浣跨敤UserType鐨勫師鍥犳槸錛氫竴鏃﹂噰鐢ㄤ簡UserType錛屼綘鐨勯」鐩氨鑴辯浜咼PA錛岃岀洿鎺ュ拰Hibernate鑰﹀悎鍦ㄤ竴璧蜂簡銆?br />
鎵╁睍UserType涓昏鍒嗕負涓ょ錛?br />
  1. immutable
  2. mutable
浠婂ぉ鎴戝厛涓句釜immutable鐨勪緥瀛愩?br />
Java 5鎻愬嚭浜嗕竴涓柊鐨別num綾伙紝JPA鎻愪緵鐨勬爣鍑嗘柟娉曟槸淇濆瓨enum鐨刵ame鎴栬呮槸ordinal銆傝繖縐嶉粯璁ゆ柟寮忚兘澶熸弧瓚蟲柊寮鍙戠殑欏圭洰錛屼絾鏄浜庝竴浜涜侀」鐩炕鏂板茍涓嶄竴瀹氶傜敤銆備笅闈㈡垜浠潵鐪嬩竴涓緥瀛愶細

public class Status {

    
public static final int ACTIVATED = 5;
    
public static final int DEACTIVATED = 6;
}

榪欎釜鏄湪java5涔嬪墠甯哥敤鐨勫父閲忓畾涔夋柟娉曪紝鑰侀」鐩暟鎹簱閲岄潰宸茬粡淇濆瓨浜嗗緢澶氱殑5鍟?鐨勩傜幇鍦ㄨ鎶奡tatus鏀瑰啓鎴恊num錛岃屼笖涓嶅笇鏈涗慨鏀規暟鎹簱涓凡鏈夌殑鏁版嵁錛屾庝箞鍋氾紵絎竴鍙嶅簲錛宻tatus enum鍙互榪欎箞鍐欙細

public enum Status {
        ACTIVATED,
        DEACTIVATED;
}

鎸佷箙鍖杄num鐨刵ame灞炴ф槸鑲畾涓嶇敤鑰冭檻浜嗭紝ordinal灞炴у憿錛熻繖閲岃淇濆瓨鐨勫彲鏄?鍜?錛岃孲tatus enum鍙湁涓や釜瀹炰綋錛屼粬浠殑ordinal鍙槸0鍜?銆傝屼笖欏圭洰涓繕浼氭湁鍏朵粬寰堝綾諱技鐨勫父閲忕被闇瑕佹敼鍐欐垚enum錛孞PA鐨勯粯璁ゆ柟寮忔棤娉曞畬鎴愪換鍔★紝榪欐椂鍊欏彲浠ュ紑濮嬭冭檻浣跨敤UserType浜嗐?br />
鍏堝畾涔変竴涓帴鍙o紝榪欐牱鍙互浣跨敤涓涓猆serType鏀寔鎵鏈夌被浼肩殑enum錛?br />
public interface DescriptionID {

    String getDescription();

    
int getId();
}

鐒跺悗鏀瑰啓Status enum:

public enum Status implements DescriptionID {

    ACTIVATED(
5"This object is activated"),  
    DEACTIVATED(
9"This object is deactivated");

    
private Integer id;
    
private String description;
    
private static List<Status> list;

    
static {
        list 
= new ArrayList<Status>(2);
        list.add(ACTIVATED);
        list.add(DEACTIVATED);
    }

    
private Status(int statusNr, String description) {
        
this.id = statusNr;
        
this.description = description;
    }

    
public String getDescription() {

        
return this.description;
    }

    
public Integer getId() {
        
return id;
    }

    
public static List<Status> getAll() {
        
return list;
    }

    
public static Status findById(Integer id) {
        
for (Status status : getAll()) {
            
if (id == status.getId()) {
                
return status;
            }
        }
        
return null;
    }

}

娉ㄦ剰榪欓噷姣忎釜enum閮藉繀欏繪湁涓や釜static鏂規硶錛岃繖浜涙柟娉曞悕蹇呴』鍦ㄦ墍鏈夌殑enum涓繚鎸佷竴鑷淬侺ist錛堬級鏂規硶鏄負浜嗘柟渚胯幏鍙栨墍鏈夌殑Status甯擱噺錛屼緥濡傚湪鐢ㄦ埛鐣岄潰閫氳繃ComboBox灞曠ず錛宖indById()鏂規硶鏄負浜嗛氳繃緇欏畾Id鑾峰緱瀵瑰簲鐨凟num瀹炰緥銆傚叾涓璮indById()鏂規硶鍙傛暟涓瀹氳鏄疘nteger錛屽師鍥犲悗闈細璁插埌銆?br />
涓嬮潰緙栧啓DescriptionIDUserType錛?br />


public class DescriptionIDUserType implements UserType, ParameterizedType {

    
private Class enumClass;

    
public void setParameterValues(Properties parameters) {
        
try {
            enumClass 
= ReflectHelper.classForName(parameters.getProperty("class"));
        } 
catch (ClassNotFoundException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    
public Object assemble(Serializable cached, Object arg1)
            
throws HibernateException {

        
return cached;
    }
    
    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object)
     
*/
    
public Object deepCopy(Object value) throws HibernateException {
        
// TODO Auto-generated method stub
        return value;
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#disassemble(java.lang.Object)
     
*/
    
public Serializable disassemble(Object value) throws HibernateException {
        
// TODO Auto-generated method stub
        return (Serializable) value;
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#equals(java.lang.Object,
     *      java.lang.Object)
     
*/
    
public boolean equals(Object id1, Object id2) throws HibernateException {
        
if (id1 == id2) {
            
return true;
        }
        
if (id1 == null || id2 == null) {
            
return false;
        }

        
final DescriptionID did1 = (DescriptionID) id1;
        
final DescriptionID did2 = (DescriptionID) id2;

        
return did1.getId() == did2.getId()
                
&& StringUtils.equals(did1.getDescription(), did2
                        .getDescription());
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#hashCode(java.lang.Object)
     
*/
    
public int hashCode(Object value) throws HibernateException {
        
// TODO Auto-generated method stub
        return value.hashCode();
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#isMutable()
     
*/
    
public boolean isMutable() {
        
// TODO Auto-generated method stub
        return false;
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet,
     *      java.lang.String[], java.lang.Object)
     
*/
    
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
            
throws HibernateException, SQLException {
        
try {
            
int id = resultSet.getInt(names[0]);
            
if (resultSet.wasNull()) {
                
return null;
            }
            
return enumClass.getMethod("findById"new Class[] { Integer.class })
                    .invoke(
null, id);
        } 
catch (IllegalArgumentException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (SecurityException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (IllegalAccessException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (InvocationTargetException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (NoSuchMethodException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        
return null;
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement,
     *      java.lang.Object, int)
     
*/
    
public void nullSafeSet(PreparedStatement statement, Object value, int index)
            
throws HibernateException, SQLException {
        
if (value == null) {
            statement.setNull(index, Hibernate.INTEGER.sqlType());
        } 
else {
            DescriptionID dID 
= (DescriptionID) value;
            statement.setInt(index, dID.getId());
        }
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#replace(java.lang.Object,
     *      java.lang.Object, java.lang.Object)
     
*/
    
public Object replace(Object original, Object arg1, Object arg2)
            
throws HibernateException {
        
// TODO Auto-generated method stub
        return original;
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#returnedClass()
     
*/
    
public Class returnedClass() {
        
return DescriptionID.class;
    }

    
/*
     * (non-Javadoc)
     * 
     * @see org.hibernate.usertype.UserType#sqlTypes()
     
*/
    
public int[] sqlTypes() {
        
return new int[]{Hibernate.INTEGER.sqlType()};
    }


}

鎴戜滑鐨勮繖涓猆serType鏄鏀寔瀹炵幇DescriptionID鐨勫悇縐嶄笉鍚岀殑enum錛岃宔num鏄病娉曠戶鎵跨殑銆傛墍浠ユ垜浠渶瑕佺敤鎴風粰鍑哄叿浣撶殑鍙傛暟錛屼互榪涗竴姝ョ‘瀹氬埌搴曟槸鍝釜enum綾匯傝繖涔熷氨瀵艱嚧浜嗭紝鎴戜滑鐨勮繖涓被闇瑕佸疄鐜?/span>ParameterizedType鎺ュ彛銆?/span>

鐢變簬enum綾繪湰韜槸immutable鐨勶紝鎵浠ヨ繖涓猆serType鐨勫疄鐜扮被鐩稿姣旇緝綆鍗曪紝涓昏鐨勪袱涓柟娉曟槸
nullSafeGet鍜?/span>nullSafeSet銆傚湪nullSaftGet涓垜浠嬌鐢↗ava Reflection騫跺熷姪鐢ㄦ埛緇欏嚭鐨別num綾誨弬鏁扮洿鎺ヨ皟鐢ㄨenum綾葷殑findById錛堬級鏂規硶錛岃繖鏍鋒垜浠氨鍙互浣跨敤鏁版嵁搴撲腑鐨刬nteger鎵懼埌瀵瑰簲鐨別num瀹炰緥銆傛敞鎰忥紝鐢變簬浣跨敤浜咼ava Reflection,鎵浠indById()鏂規硶鍙傛暟蹇呴』鏄疘nteger鑰岄潪int銆?鍦╪ullSafeSet涓紝鎴戜滑鍒欓氳繃DescriptionID鎺ュ彛鐩存帴鑾峰彇enum瀹炰緥鐨刬d灞炴э紝騫朵笖灝嗗畠淇濆瓨鍒版暟鎹簱涓幓銆?br />
鏈鍚庣湅鐪嬫庝箞浣跨敤榪欎釜UserType錛?br />
@TypeDefs({@TypeDef(name = "status", typeClass = DescriptionIDUserType.class
                    parameters 
= {@Parameter(name = "class", value = "com.yourpackage.Status")})})
@Entity
public class SomeObject {

    
private Integer objectId;
    
private Status status;

    @Id
   
@GeneratedValue(strategy=GenerationType.AUTO)   
   
public Integer getObjectId() {
        
return objectId;
    }

    
public void setObjectId(Integer objectId) {
        
this.objectId = objectId;
    }

    @Type(type 
= "status")
    
public Status getStatus() {
        
return status;
    }

    
public void setStatus(Status status) {
        
this.status = status;
    }
}

鍏朵腑鍊煎緱璁茶鐨勫氨鏄畾涔塗ype鏃朵嬌鐢ㄧ殑parameter,"class"鍙傛暟鏄垜浠嚜宸卞畾涔夌殑錛岃鍙傛暟涓?span style="color: #000000;">DescriptionIDUserType鎻愪緵
浜嗗叿浣撶殑enum綾匯傚墠闈㈠凡緇忚榪囦簡錛?span style="color: #000000;">DescriptionIDUserType灝辨槸鍦ㄨ繍琛屾椂鎬佸埄鐢ㄨ繖涓弬鏁拌嚜瀹氫箟enum涓庢暟鎹簱涔嬮棿鐨勬寔涔呭寲閫昏緫銆?br />
浣跨敤榪欎釜UserType涔嬪悗錛屾垜浠氨鍙互鍦ㄧ‘淇濇暟鎹簱鏁版嵁涓嶅彉鐨勬儏鍐典笅錛屾垚鍔熷湴灝嗙被鍨嬩笉淇濋櫓鐨勫父閲忕被鏀瑰啓鎴恊num錛岃屼笖榪欎釜UserType鏀寔鎵鏈夊疄鐜頒簡
DescriptionID鎺ュ彛鐨別num綾匯?br />
綾諱技鐨勬儏鍐墊湅鍙嬩滑鍙互鑷敱鍙戞尌浜嗐?br />
鍏充簬Annotation鍜孶sertype鐨勭浉鍏崇煡璇嗚鍙傝冩垜鍐欑殑

]]>
主站蜘蛛池模板: 最近高清中文字幕免费| 亚洲精品GV天堂无码男同| 亚洲AV综合色一区二区三区| 亚洲欧洲日产国码无码网站| 亚洲色婷婷综合久久| 久久亚洲精品无码播放| 91麻豆国产自产在线观看亚洲| 亚洲情a成黄在线观看| 在线亚洲97se亚洲综合在线| 中文字幕亚洲电影| 精品国产_亚洲人成在线高清| 久久精品国产亚洲AV网站| 久久精品国产亚洲AV麻豆王友容| 亚洲情a成黄在线观看动漫尤物| 亚洲色图在线播放| 亚洲日本视频在线观看| 亚洲综合在线一区二区三区| 在线观看亚洲免费| 国产免费黄色无码视频| 男人的天堂网免费网站| 1000部拍拍拍18勿入免费视频下载 | 亚洲娇小性色xxxx| 亚洲中文字幕无码久久2017 | 中美日韩在线网免费毛片视频| 精品亚洲成a人片在线观看少妇| 免费在线观看黄网站| 免费看大黄高清网站视频在线| 美丽姑娘免费观看在线观看中文版 | 亚洲欧美乱色情图片| 亚洲第一成人在线| 午夜亚洲国产理论片二级港台二级| 鲁啊鲁在线视频免费播放| 爽爽爽爽爽爽爽成人免费观看| 2022久久国产精品免费热麻豆| 免费看国产成年无码AV片| 亚洲AV之男人的天堂| 亚洲bt加勒比一区二区| 伊人久久亚洲综合影院首页| 一级做a爰全过程免费视频毛片| 一级毛片免费毛片一级毛片免费| 99在线视频免费观看视频 |