Java中的延迟分配
程序員本來就是懶惰的,而similis simili gaudet就像程序是懶惰的一樣。 您聽說過延遲加載嗎? 還是懶惰的單身人士? (不過,我個人更喜歡單一麥芽版本。)如果使用Scala或Kotlin(這也是一種JVM語言)進行編程,則您甚至可以以惰性方式評估表達式。
如果您在Scala中編程,則可以編寫
lazy val z = "Hello"并且僅在首次訪問z時才對表達式求z 。 如果您使用Kotlin編程,則可以編寫如下內容
val z: String by lazy { "Hello" }并且僅在首次訪問z時才對表達式求z 。
Java本身不支持這種惰性評估,但是作為一種功能強大的語言,Java提供了可用于獲得相同結果的語言元素。 當Scala和Kotlin給您魚時,Java教您捕獲自己的魚。 (讓我們在這個想法中發揮作用。)
當您在Scala和/或Kotlin中對以上行進行編碼時,在后臺真正發生的事情是不對表達式進行求值,并且變量將不包含表達式的結果。 相反,這些語言會創建一些虛擬的“ lambda”表達式,這是一個“供應商”,以后將用于計算該表達式的值。
我們可以用Java自己完成。 我們可以使用一個簡單的類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(); } }該類具有可用于定義供應商的public static方法let() ,并且在首次調用方法get()會調用此供應商。 使用此類,您可以將以上示例編寫為
var z = Lazy.let( () -> "Hello" );順便說一句,它似乎比Kotlin版本更簡單。 您可以使用庫中的類:
com.javax0 lazylet 1.0.0然后您無需將代碼復制到您的項目中。 這是一個微型庫,僅包含此類和一個內部類,該內部類使Lazy可以在多線程環境中使用。
用法很簡單,如單元測試所示:
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);并獲得可以由多個線程使用的Lazy供應商,但仍可以保證作為參數傳遞的供應商僅傳遞一次。
給你一條魚或教你釣魚
我說要在便簽上寫上別針:“雖然Scala和Kotlin給您魚,但是Java教您捕捉自己的魚?!?這就是我的意思。
許多程序員在不了解程序如何執行的情況下編寫程序。 他們使用Java編程并且編寫了不錯的代碼,但是他們不知道底層技術是如何工作的。 他們對類加載器,垃圾回收一無所知。 或者他們知道,但是他們對JIT編譯器生成的機器代碼一無所知。 或者他們甚至這樣做,但他們對處理器緩存,不同的內存類型,硬件體系結構一無所知。 或者他們知道但不了解微電子學和光刻技術,以及集成電路的布局,電子在半導體內部的移動方式,量子力學如何確定計算機的不確定內部工作方式。
我并不是說您必須是物理學家,并且要了解量子力學的復雜細節才能成為優秀的程序員。 但是,我建議您了解日常工作工具下面的幾層內容。 如果您使用Kotlin或Scala,則絕對可以使用它們提供的惰性結構。 在這種特定情況下,它們使編程抽象比Java提供的編程抽象高一個級別。 但是,至關重要的是要知道實現的外觀。 如果您知道如何釣魚,則可以購買包裝魚,因為這樣您就可以分辨出什么時候才是好魚。 如果您不知道如何釣魚,您將依靠那些給您釣魚的人的憐憫。
翻譯自: https://www.javacodegeeks.com/2019/05/lazy-assignment-java.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Java中的延迟分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: akka2.5_发布Akka Toolk
- 下一篇: 勇者斗恶龙8安卓汉化版下载(勇者斗恶龙8