Kotlin thread safe native lazy singleton with parameter

后端 未结 3 2009
感情败类
感情败类 2020-12-28 15:44

In java we can write thead-safe singletons using double Checked Locking & volatile:

    public class Singleton {         


        
3条回答
  •  醉梦人生
    2020-12-28 16:02

    Kotlin has an equivalent of your Java code, but more safe. Your double lock check is not recommended even for Java. In Java you should use an inner class on the static which is also explained in Initialization-on-demand holder idiom.

    But that's Java. In Kotlin, simply use an object (and optionally a lazy delegate):

    object Singletons {
        val something: OfMyType by lazy() { ... }
    
        val somethingLazyButLessSo: OtherType = OtherType()
        val moreLazies: FancyType by lazy() { ... }
    }
    

    You can then access any member variable:

    // Singletons is lazy instantiated now, then something is lazy instantiated after.  
    val thing = Singletons.something // This is Doubly Lazy!
    
    // this one is already loaded due to previous line
    val eager = Singletons.somethingLazyButLessSo
    
    // and Singletons.moreLazies isn't loaded yet until first access...
    

    Kotlin intentionally avoids the confusion people have with singletons in Java. And avoids the "wrong versions" of this pattern -- of which there are many. It instead provides the simpler and the safest form of singletons.

    Given the use of lazy(), if you have other members each would individually be lazy. And since they are initialized in the lambda passed to lazy() you can do things that you were asking about for about customizing the constructor, and for each member property.

    As a result you have lazy loading of Singletons object (on first access of instance), and then lazier loading of something (on first access of member), and complete flexibility in object construction.

    See also:

    • lazy() function
    • Lazy thread safe mode options
    • Object declarations

    As a side note, look at object registry type libraries for Kotlin that are similar to dependency injection, giving you singletons with injection options:

    • Injekt - I'm the author
    • Kodein - Very similar and good

提交回复
热议问题