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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的延迟分配

發(fā)布時(shí)間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的延迟分配 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

程序員本來就是懶惰的,而similis simili gaudet就像程序是懶惰的一樣。 您聽說過延遲加載嗎? 還是懶惰的單身人士? (不過,我個(gè)人更喜歡單一麥芽版本。)如果使用Scala或Kotlin(這也是一種JVM語言)進(jìn)行編程,則您甚至可以以惰性方式評(píng)估表達(dá)式。

如果您在Scala中編程,則可以編寫

lazy val z = "Hello"

并且僅在首次訪問z時(shí)才對(duì)表達(dá)式求z 。 如果您使用Kotlin編程,則可以編寫如下內(nèi)容

val z: String by lazy { "Hello" }

并且僅在首次訪問z時(shí)才對(duì)表達(dá)式求z 。

Java本身不支持這種惰性評(píng)估,但是作為一種功能強(qiáng)大的語言,Java提供了可用于獲得相同結(jié)果的語言元素。 當(dāng)Scala和Kotlin給您魚時(shí),Java教您捕獲自己的魚。 (讓我們?cè)谶@個(gè)想法中發(fā)揮作用。)

當(dāng)您在Scala和/或Kotlin中對(duì)以上行進(jìn)行編碼時(shí),在后臺(tái)真正發(fā)生的事情是不對(duì)表達(dá)式進(jìn)行求值,并且變量將不包含表達(dá)式的結(jié)果。 相反,這些語言會(huì)創(chuàng)建一些虛擬的“ lambda”表達(dá)式,這是一個(gè)“供應(yīng)商”,以后將用于計(jì)算該表達(dá)式的值。

我們可以用Java自己完成。 我們可以使用一個(gè)簡單的類Lazy提供以下功能:

public class Lazy implements Supplier { final private Supplier supplier; supplied = private boolean supplied = false ; private T value; private Lazy(Supplier supplier) { this .supplier = supplier; } public static Lazy let(Supplier supplier) { return new Lazy(supplier); } @Override public T get() { if (supplied) { return value; } supplied = true ; return value = supplier.get(); } }

該類具有可用于定義供應(yīng)商的public static方法let() ,并且在首次調(diào)用方法get()會(huì)調(diào)用此供應(yīng)商。 使用此類,您可以將以上示例編寫為

var z = Lazy.let( () -> "Hello" );

順便說一句,它似乎比Kotlin版本更簡單。 您可以使用庫中的類:

com.javax0 lazylet 1.0.0

然后您無需將代碼復(fù)制到您的項(xiàng)目中。 這是一個(gè)微型庫,僅包含此類和一個(gè)內(nèi)部類,該內(nèi)部類使Lazy可以在多線程環(huán)境中使用。

用法很簡單,如單元測(cè)試所示:

private static class TestSupport { int count = 0 ; boolean callMe() { count++; return true ; } } ... final var ts = new TestSupport(); var z = Lazy.let(ts::callMe); if ( false && z.get()) { Assertions.fail(); } Assertions.assertEquals( 0 , ts.count); z.get(); Assertions.assertEquals( 1 , ts.count); z.get(); Assertions.assertEquals( 1 , ts.count);

要獲取多線程安全版本,可以使用以下代碼:

final var ts = new TestSupport(); var z = Lazy.sync(ts::callMe); if ( false && z.get()) { Assertions.fail(); } Assertions.assertEquals( 0 , ts.count); z.get(); Assertions.assertEquals( 1 , ts.count); z.get(); Assertions.assertEquals( 1 , ts.count);

并獲得可以由多個(gè)線程使用的Lazy供應(yīng)商,但仍可以保證作為參數(shù)傳遞的供應(yīng)商僅傳遞一次。

給你一條魚或教你釣魚

我說要在便簽上寫上別針:“雖然Scala和Kotlin給您魚,但是Java教您捕捉自己的魚?!?這就是我的意思。

許多程序員在不了解程序如何執(zhí)行的情況下編寫程序。 他們使用Java編程并且編寫了不錯(cuò)的代碼,但是他們不知道底層技術(shù)是如何工作的。 他們對(duì)類加載器,垃圾回收一無所知。 或者他們知道,但是他們對(duì)JIT編譯器生成的機(jī)器代碼一無所知。 或者他們甚至這樣做,但他們對(duì)處理器緩存,不同的內(nèi)存類型,硬件體系結(jié)構(gòu)一無所知。 或者他們知道但不了解微電子學(xué)和光刻技術(shù),以及集成電路的布局,電子在半導(dǎo)體內(nèi)部的移動(dòng)方式,量子力學(xué)如何確定計(jì)算機(jī)的不確定內(nèi)部工作方式。

我并不是說您必須是物理學(xué)家,并且要了解量子力學(xué)的復(fù)雜細(xì)節(jié)才能成為優(yōu)秀的程序員。 但是,我建議您了解日常工作工具下面的幾層內(nèi)容。 如果您使用Kotlin或Scala,則絕對(duì)可以使用它們提供的惰性結(jié)構(gòu)。 在這種特定情況下,它們使編程抽象比Java提供的編程抽象高一個(gè)級(jí)別。 但是,至關(guān)重要的是要知道實(shí)現(xiàn)的外觀。 如果您知道如何釣魚,則可以購買包裝魚,因?yàn)檫@樣您就可以分辨出什么時(shí)候才是好魚。 如果您不知道如何釣魚,您將依靠那些給您釣魚的人的憐憫。

翻譯自: https://www.javacodegeeks.com/2019/05/lazy-assignment-java.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Java中的延迟分配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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