java8 函数式编程_Java 8函数式编程:延迟实例化
java8 函數式編程
單例通常會延遲實例化自己,有時,如果對象足夠重,則可以延遲實例化類字段。
通常,在走惰性路線時,getter方法(或accessor )必須具有一段代碼,該代碼塊在返回對象之前檢查是否已實例化該對象(如果不是,則需要實例化)。 一旦實例化了對象,該檢查就沒有意義。 它只會減慢已(通常)使用同步或鎖定進行阻塞的方法的速度。 讓我們看一下刪除該代碼的方法,對嗎?
免責聲明
我沒有想到這個。 我是從Venkat Subramaniam的Java函數編程中獲得的。 我強烈推薦這本書和作者。 Venkat所閱讀的所有內容都做得很好,而且易于學習。
它是如何工作的?
基本思想是:
因此,讓我們看看實際情況。 我們將有一個名為Holder的類,該類要延遲實例化Heavy類型的對象。 此代碼直接從Venkat的書中編譯而成:
public class Holder {private Supplier heavy = () -> createAndCacheHeavy();public Heavy getHeavy(){return heavy.get();}private synchronized Heavy createAndCacheHeavy(){class HeavyFactory implements Supplier{private final Heavy heavyInstance = new Heavy();public Heavy get(){return heavyInstance;}}if(!HeavyFactory.class.isInstance(heavy)){heavy = new HeavyFactory();}return heavy.get();} }現在,此代碼可以正常工作,但是我發現createAndCacheHeavy的實現不必要地令人困惑。 第一次看到此代碼時,我花了很長時間才弄清楚它在做什么。
因此,讓我們對其進行一些修改,對吧? 我們將使它看起來像是按照我之前列出的步驟進行操作。
private Heavy createAndCacheHeavy() {Heavy instance = new Heavy();heavy = () -> instance;return instance; }那不是更好嗎? 我認為,這比以前更簡單,更干凈。 而且仍然有效! 好吧,這里有一個小警告:為了使代碼具有線程安全性,您需要同步getInstance()方法而不是createAndCacheHeavy方法。 與Venkat的代碼相比,這種更改會使代碼的速度稍慢一些,因為一旦HeavyFactory到位,他的代碼就不會使用同步。 但是它仍然比每次都需要同步和有條件檢查的舊方法要快。
因此,這是一些有用的代碼,但是您是否想在每次懶惰地實例化某些東西時都鍵入該代碼? 我不這么認為。 因此,讓我們創建一個可重用的類,使我們的生活更加輕松。
但是首先,只是為了向您展示它變得更容易使用,讓我向您展示它的使用情況。
Supplier<Heavy> heavy = LazilyInstantiate.using(() -> new Heavy());而已! 讓我們更仔細地看一下它,并深入研究它,然后再進行研究。
該行的聲明位與以前相同; 一家名為Heavy的重型供應商。 但是隨后我們調用了LazilyInstantiate的靜態方法,該方法原來是返回工廠實現Supplier的LazilyInstantiate對象的靜態工廠方法。 傳遞給該方法的參數是在那里的“重型供應商”,因此用戶可以為實例化器提供正確的代碼以實例化對象。
那么,您是否對它的工作方式感到好奇? 好,這是LazilyInstantiate的代碼:
public class LazilyInstantiate implements Supplier {public static LazilyInstantiate using(Supplier supplier){return new LazilyInstantiate<>(supplier);}public synchronized T get(){return current.get();}private LazilyInstantiate(Supplier supplier){this.supplier = supplier;this.current = () -> swapper();}private final Supplier supplier;private Supplier current;private T swapper(){T obj = supplier.get();current = () -> obj;return obj;} }您可能會發現我的方法的順序與通常的方法有所不同。 我更喜歡先擁有公共的東西,然后擁有私有的和受保護的包裹,然后擁有私有的東西。 在這些塊中,我執行靜態字段,然后構造函數,然后是靜態方法,然后是普通字段,然后是普通方法。 通常,這似乎按照用戶閱讀我的代碼的最重要程度至最不重要的順序對事物進行了排序。
您可以隨意將代碼復制到任何地方,也可以在github上查看我的Functional-java庫 ,該庫具有此類的完整文檔版本(func.java.lazy.LazilyInstantiate)和許多其他有用的函數類。
翻譯自: https://www.javacodegeeks.com/2015/01/java-8-functional-programming-lazy-instantiation.html
java8 函數式編程
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java8 函数式编程_Java 8函数式编程:延迟实例化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓软件大师下载安装(安卓软件大师)
- 下一篇: 延时备案风险(延时备案)