日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8函数式编程:延迟实例化

發(fā)布時間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8函数式编程:延迟实例化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

單例通常會延遲實例化自己,有時,如果對象足夠重,則可以延遲實例化類字段。

通常,在走惰性路線時,getter方法(或accessor )必須具有一段代碼,該代碼塊在返回對象之前檢查對象是否已實例化(如果不是,則需要實例化)。 一旦實例化了對象,該檢查就沒有意義。 它只會減慢已經(jīng)(通常)使用同步或鎖定進行阻塞的方法的速度。 讓我們看一下刪除該代碼的方法,對吧?

免責聲明

我沒有想到這個。 我是從Venkat Subramaniam的Java函數(shù)編程中獲得的。 我強烈推薦這本書和作者。 Venkat所閱讀的所有內(nèi)容都做得很好,而且易于學習。

它是如何工作的?

基本思想是:

  • 將延遲實例化的字段替換為所需類型的供應(yīng)商。
  • 供應(yīng)商實例化該對象(但尚未返回)
  • 然后將字段設(shè)置為僅返回實例化對象的新Supplier
  • 返回實例
  • 因此,讓我們看看實際情況。 我們將有一個名為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();} }

    現(xiàn)在,此代碼可以正常工作,但是我發(fā)現(xiàn)createAndCacheHeavy的實現(xiàn)不必要地令人困惑。 第一次看到此代碼時,我花了很長時間才弄清楚它在做什么。

    因此,讓我們對其進行一些修改,對吧? 我們將使它看起來像是按照我之前列出的步驟進行操作。

    private Heavy createAndCacheHeavy() {Heavy instance = new Heavy();heavy = () -> instance;return instance; }

    那不是更好嗎? 我認為,這比以前更簡單,更干凈。 而且仍然有效! 好吧,這里有一個小警告:為了使代碼具有線程安全性,您需要同步getInstance()方法而不是createAndCacheHeavy方法。 與Venkat的代碼相比,這種更改會使代碼的速度稍慢一些,因為一旦HeavyFactory就緒,他的代碼就不會使用同步。 但是它仍然比每次都需要同步和有條件檢查的舊方法要快。

    因此,這是一些有用的代碼,但是您是否想在每次懶惰地實例化某些東西時都鍵入該代碼? 我不這么認為。 因此,讓我們創(chuàng)建一個可重用的類,使我們的生活更加輕松。

    但是首先,只是為了向您展示它變得更容易使用,讓我向您展示它的使用情況。

    Supplier<Heavy> heavy = LazilyInstantiate.using(() -> new Heavy());

    而已! 讓我們更仔細地看一下它,并深入研究它,然后再進行研究。

    該行的聲明位與以前相同; 一家名為Heavy的重型供應(yīng)商。 但是隨后我們調(diào)用了LazilyInstantiate的靜態(tài)方法,該方法原來是返回工廠實現(xiàn)Supplier的LazilyInstantiate對象的靜態(tài)工廠方法。 傳遞給該方法的參數(shù)是在那里的“重型供應(yīng)商”,因此用戶可以為實例化器提供正確的代碼以實例化對象。

    那么,您是否對它的工作方式感到好奇? 好了,這是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;} }

    您可能會發(fā)現(xiàn)我的方法的順序與通常的方法有所不同。 我更喜歡先擁有公共資源,然后擁有私有和受保護包,然后擁有私有資源。 在這些塊中,我執(zhí)行靜態(tài)字段,然后構(gòu)造函數(shù),然后是靜態(tài)方法,然后是普通字段,然后是普通方法。 通常,對于用戶閱讀我的代碼而言,這似乎按照最重要的順序?qū)⑵渑判驗樽畈恢匾?

    您可以隨意將代碼復(fù)制到任何地方,也可以在github上查看我的function-java庫 ,該庫具有此類的完整文檔版本(func.java.lazy.LazilyInstantiate)和許多其他有用的函數(shù)類。

    翻譯自: https://www.javacodegeeks.com/2015/01/java-8-functional-programming-lazy-instantiation.html

    總結(jié)

    以上是生活随笔為你收集整理的Java 8函数式编程:延迟实例化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。