java中延迟_Java中的延迟分配
java中延遲
程序員本質(zhì)上是懶惰的,而similis simili gaudet就像程序是懶惰的一樣。 您聽說(shuō)過(guò)延遲加載嗎? 還是懶惰的單身人士? (不過(guò),我個(gè)人更喜歡單一麥芽版本。)如果使用Scala或Kotlin(這也是一種JVM語(yǔ)言)進(jìn)行編程,則您甚至可以以惰性方式評(píng)估表達(dá)式。
如果您在Scala中編程,則可以編寫
lazy val z = "Hello"并且僅在首次訪問(wèn)z時(shí)才對(duì)表達(dá)式求z 。 如果您在Kotlin編程,您可以編寫類似
val z: String by lazy { "Hello" }并且僅在首次訪問(wèn)z時(shí)才對(duì)表達(dá)式求z 。
Java本身不支持這種惰性評(píng)估,但是作為一種功能強(qiáng)大的語(yǔ)言,Java提供了可用于獲得相同結(jié)果的語(yǔ)言元素。 Scala和Kotlin會(huì)給您魚,而Java會(huì)教您捕獲自己的魚。 (讓我們?cè)谶@個(gè)想法中發(fā)揮作用。)
當(dāng)您在Scala和/或Kotlin中對(duì)以上行進(jìn)行編碼時(shí),在后臺(tái)真正發(fā)生的事情是不對(duì)表達(dá)式進(jìn)行求值,并且變量將不保存表達(dá)式的結(jié)果。 相反,這些語(yǔ)言會(huì)創(chuàng)建一些虛擬的“ lambda”表達(dá)式,這是一個(gè)“供應(yīng)商”,以后將用于計(jì)算該表達(dá)式的值。
我們可以用Java自己完成。 我們可以使用一個(gè)簡(jiǎn)單的類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" );順便說(shuō)一句,它似乎比Kotlin版本更簡(jiǎn)單。 您可以使用庫(kù)中的類:
com.javax0 lazylet 1.0.0然后您無(wú)需將代碼復(fù)制到您的項(xiàng)目中。 這是一個(gè)微型庫(kù),僅包含此類和一個(gè)內(nèi)部類,該內(nèi)部類使Lazy可以在多線程環(huán)境中使用。
使用很簡(jiǎ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)商僅傳遞一次。
給你一條魚或教你釣魚
我說(shuō)要在便簽上寫上別針:“雖然Scala和Kotlin給您的魚,但是Java教您捕捉自己的魚。” 這就是我的意思。
許多程序員在不了解程序如何執(zhí)行的情況下編寫程序。 他們使用Java編程并且編寫了不錯(cuò)的代碼,但是他們不知道底層技術(shù)如何工作。 他們對(duì)類加載器,垃圾回收一無(wú)所知。 或者他們知道,但是他們對(duì)JIT編譯器生成的機(jī)器代碼一無(wú)所知。 或者他們甚至這樣做,但他們對(duì)處理器緩存,不同的內(nèi)存類型,硬件體系結(jié)構(gòu)一無(wú)所知。 或者他們知道但不了解微電子學(xué)和光刻技術(shù),以及集成電路的布局,電子在半導(dǎo)體內(nèi)部的移動(dòng)方式,量子力學(xué)如何確定計(jì)算機(jī)的不確定內(nèi)部工作方式。
我并不是說(shuō)您必須是物理學(xué)家,并且要了解量子力學(xué)的復(fù)雜細(xì)節(jié)才能成為優(yōu)秀的程序員。 但是,我建議您了解日常工作工具下面的幾層內(nèi)容。 如果您使用Kotlin或Scala,則絕對(duì)可以使用它們提供的惰性結(jié)構(gòu)。 在這種特定情況下,它們使編程抽象比Java提供的編程抽象高一個(gè)級(jí)別。 但是,至關(guān)重要的是要知道實(shí)現(xiàn)的外觀。 如果您知道如何釣魚,則可以購(gòu)買包裝魚,因?yàn)檫@樣您就可以分辨出什么時(shí)候才是好魚。 如果您不知道如何釣魚,您將依靠那些給您釣魚的人的憐憫。
翻譯自: https://www.javacodegeeks.com/2019/05/lazy-assignment-java.html
java中延遲
總結(jié)
以上是生活随笔為你收集整理的java中延迟_Java中的延迟分配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: foxmail怎么添加qq邮箱()
- 下一篇: dns怎么更改(dns怎么修改)