日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

JAVA中用動態(tài)代理類實現(xiàn)記憶功能(二)

瀏覽:142日期:2024-06-23 08:54:26
內(nèi)容: 通過動態(tài)代理類來創(chuàng)建一個通用的緩存包裝器 上面第二種方法僅有的缺點就是緩存包裝器不能重用,每次我們希望添加一個緩存給某個類,我們就要寫一個特殊的緩存包裝器給目標(biāo)接口.這是一個很慢,容易出錯的過程. Jdk1.3開始支持動態(tài)代理類: 特別的類能夠在運行期決定實現(xiàn)哪個接口-通常的模式都是,在運行期即決定實現(xiàn)哪個接口.通過這個,我們有可能實現(xiàn)一個通用的緩存包裝器,我們稱它為Memoizer,在運行期決定實現(xiàn)哪個接口.這樣, CachingBinaryDigitsCalculator就是不再需要的.它是這樣被調(diào)用的:BinaryDigitsCalculator calculator = new CachingBinaryDigitsCalculator( new PiBinaryDigitsCalculator() );可以通過Memoizer來重寫如下:BinaryDigitsCalculator calculator = (BinaryDigitsCalculator) Memoizer.memoize( new PiBinaryDigitsCalculator() );Memoizer的代碼如下:import java.lang.reflect.InvocationHandler;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Arrays;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;public class Memoizer implements InvocationHandler { public static Object memoize(Object object) { return Proxy.newProxyInstance( object.getClass().getClassLoader(), object.getClass().getInterfaces(), new Memoizer(object) ); } private Object object; private Map caches = new HashMap(); private Memoizer(Object object) { this.object = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getReturnType().equals(Void.TYPE)) { // Don't cache void methods return invoke(method, args); } else { Map cache = getCache(method); List key = Arrays.asList(args); Object value = cache.get(key); if (value == null && !cache.containsKey(key)) { value = invoke(method, args); cache.put(key, value); } return value; } } private Object invoke(Method method, Object[] args) throws Throwable { try { return method.invoke(object, args); } catch (InvocationTargetException e) { throw e.getTargetException(); } } private synchronized Map getCache(Method m) { Map cache = (Map) caches.get(m); if (cache == null) { cache = Collections.synchronizedMap( new HashMap() ); caches.put(m, cache); } return cache; }} 當(dāng)調(diào)用靜態(tài)方法memoize的時候,將會創(chuàng)建一個新的代理實例-也就是一個java.lang.reflect.proxy的實例.實現(xiàn)了一個接口集.這個接口集由object.getClass().getInterfaces()來決定.每個代理實例包含一個java.lang.reflect.InvocationHandler實例來處理這個代理實例調(diào)用的相關(guān)方法.在我們的例子里,Memoizer就是一個InvocationHandler實例. 當(dāng)一個方法在代理實例里被調(diào)用,比如, calculateBinaryDigit,那么, Memoizer實例里的invoke方法就會被調(diào)用,相關(guān)信息會傳給invoke方法,以決定proxy實例調(diào)用了哪個方法,包含參數(shù)信息.在我們的例子里,傳入Memoizer的java.lang.Method參數(shù)是calculateBinaryDigit,而參數(shù)信息則是pi需要精確的位數(shù)-整數(shù)n.在這個基礎(chǔ)上,Memoizer能夠進(jìn)一步進(jìn)行緩存操作的. 在例子里(caches是一個Hashmap,cache是一個map)里用到的Key,主要是傳入的方法信息:Method對象和參數(shù)對象. 為了實現(xiàn)的簡單與通用性,Memoizer有一個關(guān)于cache的HashMap caches,每個method是一個key,對應(yīng)的value為一個cache.然后把參數(shù)信息轉(zhuǎn)化成一個List對象,作為cache的Key.使用List是很方便的,同時也可以保證equals()方法,所以能夠保證當(dāng)且僅當(dāng)參數(shù)信息完全相同的時候這個List才相等. 一旦一個cache的Key被創(chuàng)建,那么,計算之前都會先查找這個cache,如果找到,則返回cache里的值.否則,如果帶有這些參數(shù)的這個方法沒有被調(diào)用過,那么,則會通過invoke來調(diào)用這個method.在我們的例子里, 實例PiBinaryDigitsCalculator 里的calculateBinaryDigit方法將會通過invoke被調(diào)用.而且計算結(jié)果將會被存在cache里.何時使用Memoizer 作為一條通用的規(guī)則,Memoizer能夠在任何需要傳統(tǒng)的cache的時候使用-比如上面提到的例子. 特別地,接口里每個需要使用記憶功能的method需要滿足下面幾條條件:1. 這個method的返回值最好不要每次調(diào)用都會改變2. 這個method不要有副效應(yīng)3. 這個method的參數(shù)是確定的,非mutable的. 顯然,如果每次調(diào)用這個method返回值都不同,那么cache就毫無用處了.同樣也是很重要的一點是,因為有副效應(yīng)的method不會被重復(fù),所以這個method不能有副效應(yīng)(method自動更新某些狀態(tài)).當(dāng)然,void方法除外. 同樣,memorize一個帶有未定(mutable)參數(shù)的method是很危險的,因為,要把這些參數(shù)儲存到hashmap里會是很危險的一件事.根據(jù)Map的定義,當(dāng)這個Map里的key發(fā)生改變,Map是不知道的.所以,當(dāng)你執(zhí)行了一次這個method之后,相關(guān)信息添加進(jìn)了Map,然后參數(shù)發(fā)生變異(mutate),第二次調(diào)用的時候,就會得到錯誤的結(jié)果.性能 使用cache的主要目的就是為了提升你的程序的速度.然而,reflection確是眾所周知的低效(在jdk1.4里有所改進(jìn),通過reflection調(diào)用方法是普通調(diào)用速度的1/2,這個比jdk1.3要快40倍).Memoizer主要依靠reflection來調(diào)用方法,所以,它看上去并不是一個好的途徑.但是,如果使用cache能給程序速度帶來的提升遠(yuǎn)高于reflection對速度的影響,那么,使用Memoizer是值得考慮的. 在我們對PiBinaryDigitsCalculator的測試中,測試環(huán)境為jdk1.4,當(dāng)n小于10的時候,使不使用cache速度是相當(dāng)?shù)?但是,當(dāng)n增大的時候,使用cache的優(yōu)勢就開始顯示出來.所以,經(jīng)常使用PiBinaryDigitsCalculator的用戶,可以考慮使用cache. 不幸的是,唯一測試你的程序是否需要cache的途徑是比較你的程序在兩種情況下的運行效率.盡管如此,因為為一個程序構(gòu)造一個cache包裝器是很容易的一件事,移除它也是很容易的,下面的建議可以作為一個參考的步驟:1. 選擇需要記憶操作的類2. 運行它3. 如果效率是滿意的,go to 64. 添加memoizer,使用cache5. 如果效率沒有顯著提升,移初memoizer6. 如果需要,重試. 理論上,你需要分析為一個類添加記憶功能對整個系統(tǒng)的影響.只有你自己清楚是否值得添加.有些方法,即使是計算量很大的,但是在這個系統(tǒng)里很少被調(diào)用,所以,沒必要為它添加記憶功能.為了保證這個,我開發(fā)了一個更有特點的Memoizer,實現(xiàn)了一個叫做CacheStatistics的接口,你能從它得到cache的數(shù)量以及無效的cache.你可以使用它作為判斷的一個尺度.擴展Memoizer 修改Memoizer類來支持不同的cache策略是很簡單的.一個比較普通的類型就是Least-Recently-Used(LRU)cahce,擁有固定數(shù)量的入口.這個cache確保入口不大于它的最大數(shù)目,如果超過,就摒棄最舊的緩存數(shù)據(jù).也就是,能夠從cache里得到的是新的數(shù)據(jù).一個類可以使用LRU cache來防止一個程序長期保持一個狀態(tài).你可以僅僅傳遞一個參數(shù)給CacheFactory里的memoize方法來選擇你需要的cache類型.下面的例子,LRU cache最多有1000個入口:BinaryDigitsCalculator calculator = (BinaryDigitsCalculator) Memoizer.memoize( new PiBinaryDigitsCalculator(), new LruCacheFactory(1000) ); 即使是這么簡單,Memoizer也應(yīng)該是java程序員一個有用的工具.參考資源:• Joshua Bloch, Effective Java Programming Language Guide. Addison Wesley Professional (2001). Contains useful advice about optimization. • Patrick Chan, The Java Developers Almanac 1.4. Addison Wesley Professional (2002). Full of Java recipes, including how to write a LRU cache. • Paul Graham, On Lisp. Prentice Hall (1993). How to write a memoizing function in Common Lisp. • Alex Martelli and David Ascher (Eds.), Python Cookbook. O'Reilly (July 2002). Recipe 17.7, Memoizing (Caching) the Return Values of Functions shows you how to memoize in Python. • Documentation for LinkedHashMap in Java SDK 1.4 • Documentation for Proxy in Java SDK 1.4 • The Memoizer Framework 關(guān)于翻譯作者chris,熱衷于java游戲引擎技術(shù),jvm技術(shù),活躍于jxta社區(qū).可以點擊:http://www.matrix.org.cn/user_view.asp?username=chris查看他的個人信息 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚州av日韩av| 日本天堂一区| 亚洲精品字幕| 丰满少妇一区| 免费在线视频一区| 精品国产a一区二区三区v免费| 亚洲天堂久久| 国产毛片久久久| 五月激情久久| 日韩av中文在线观看| 91精品婷婷色在线观看| 91国内精品| 亚洲国产不卡| 国产日韩在线观看视频| 亚洲二区精品| 国产亚洲精品美女久久| 性欧美69xoxoxoxo| 国产精品成人a在线观看| 日韩中文av| 亚洲精品网址| 91精品韩国| 国产欧美激情| 免费成人av在线播放| 日韩专区精品| 国产精品www.| 亚洲18在线| 91九色精品| zzzwww在线看片免费| 免费日韩视频| 亚洲性色av| 精品久久中文| 国产亚洲精品精品国产亚洲综合 | 麻豆视频在线观看免费网站黄| 一区二区三区午夜视频| 99精品在线| 精品国产不卡| 国产精品久久久久久久久久白浆 | 日韩免费一区| 麻豆一区二区三| 日韩欧美激情| 美女国产精品| 黄色亚洲大片免费在线观看| av免费不卡国产观看| 国产精品v日韩精品v欧美精品网站| 亚洲人成网77777色在线播放| 1000部精品久久久久久久久| 国产成人免费| 嫩草伊人久久精品少妇av杨幂| 亚洲一区二区三区四区电影| 91精品国产自产在线观看永久∴| 久久久久久久欧美精品| 日本成人在线视频网站| 久久精品三级| 亚洲国产日韩欧美在线| 日本欧美在线| 久久国产亚洲| 国产免费久久| 宅男噜噜噜66国产日韩在线观看| 国产欧美在线| 国产在线成人| 国产亚洲一区| 婷婷视频一区二区三区| 超碰99在线| 国产精品传媒麻豆hd| 中文无码久久精品| 极品日韩av| 亚洲黄色免费av| 国产激情综合| 日韩精品成人在线观看| 尤物在线精品| 久久久免费人体| 免费欧美日韩| 婷婷激情一区| 国产精品115| 亚洲一区有码| 日韩中文字幕区一区有砖一区| 桃色一区二区| 精品免费av在线| 黑人精品一区| 91亚洲成人| 福利一区在线| 精品深夜福利视频| 国产精品久久久久9999高清| 亚洲精品国产日韩| 在线一区欧美| 亚洲一区二区动漫| 欧美在线亚洲| 黄色国产精品| 中文在线不卡| 激情婷婷综合| 四虎成人av| 国产精品美女久久久久久不卡| 男人的天堂久久精品| 亚洲福利一区| 日韩中文首页| 亚洲国产影院| 九一成人免费视频| 在线视频精品| 日韩影院精彩在线| 亚洲欧美日韩国产| 三级亚洲高清视频| 亚洲精品第一| 日韩二区三区四区| 欧美在线看片| 国产精品jk白丝蜜臀av小说| 欧美日韩一区自拍| 久久香蕉网站| 日韩精品诱惑一区?区三区| 国产亚洲一区二区手机在线观看 | 日本aⅴ免费视频一区二区三区| 日韩免费精品| 国产亚洲高清在线观看| 国产精品一区二区免费福利视频| 国产日韩一区| 国产免费播放一区二区| 精品一区二区三区四区五区| 日韩综合在线| 美女少妇全过程你懂的久久| 中文精品在线| 日本国产亚洲| 鲁大师精品99久久久| 成人亚洲一区二区| 国产夫妻在线| 狠狠爱www人成狠狠爱综合网| 在线综合亚洲| 日本aⅴ亚洲精品中文乱码| 欧美1区2区3| 精精国产xxxx视频在线播放| 红桃视频国产一区| 日韩av中文在线观看| 精品一区二区三区亚洲| 伊人久久大香线蕉av不卡| 中文精品电影| 国产精品一区二区三区av| 亚洲午夜天堂| 亚洲欧美激情诱惑| 国产精品一卡| 成人小电影网站| 免费在线欧美视频| 精品视频网站| 国产视频一区三区| 国产日韩中文在线中文字幕 | 国产精品日本一区二区不卡视频| 免播放器亚洲| 国产成人精品三级高清久久91| 亚洲欧美日韩综合国产aⅴ| 麻豆国产欧美一区二区三区| 日韩午夜高潮| 另类欧美日韩国产在线| 亚洲欧美视频| 中文在线а√在线8| 日本久久一区| 国产一区日韩一区| 开心激情综合| 亚洲丝袜美腿一区| 色婷婷久久久| 美日韩一区二区三区| 久色成人在线| 午夜精品成人av| 国产极品模特精品一二| 亚洲一区二区日韩| 久久精品国产亚洲夜色av网站| 国产精品xxxav免费视频| 亚洲欧美日韩国产| 亚洲va中文在线播放免费| 国产精品一区2区3区| 丝袜美腿一区二区三区| 日韩一区三区| 麻豆免费精品视频| 日韩成人av影视| 久久高清免费观看| 久久蜜桃av| 色爱综合网欧美| 国产精品久久久久9999高清| 亚洲精品九九| 日韩亚洲国产欧美| 日韩国产一区二区三区| 免费在线日韩av| 日本天堂一区| 亚洲综合中文| 亚洲神马久久| 好看不卡的中文字幕| 日韩在线不卡| 国产成人精品一区二区三区视频 | 精品久久99| 国产精品v亚洲精品v日韩精品 | 日韩电影免费网址| 国产成年精品| 国产精品日韩精品中文字幕| 亚洲精品第一| 亚洲精品中文字幕99999| 91久久黄色| 亚洲调教视频在线观看| 日韩久久电影| 91看片一区| 精品日韩视频| 日韩欧美字幕| 视频二区不卡| 日韩不卡免费高清视频| 亚洲女同av|