41933


お世話になっております。

さて、Kotlinを最近始めました。Kotlinではsingletonは言語レベルでサポートされていて、objectを使うとあります。しかし、objectではコンストラクタが使えません。

Javaの場合

[code]

    class HBaseManager {
        private static HBaseManager ourInstance = new HBaseManager();
        private Configuration config =  HBaseConfiguration.create();
        private ArrayList<String> tableList = new ArrayList<>();
    
        static HBaseManager getInstance() {
            return ourInstance;
        }
    
        private HBaseManager() {
            config.set("hbase.zookeeper.quorum","example.com:60000");
            listTables();
        }
    }
    
[/code]

のように書くと（この場合はHBaseの）初期化を済ませて、安全にアクセスできます。

あれこれKotlinのガイドを探してみましたが、singletonの初期化に関するものを見つけることができませんでした。

とりあえず、initialize()というメソッドを定義して、singletonを使う前にかならず呼ぶというルールにして当面は乗り切ろうと思いますが、何かしらの仕組みがあるはずだと思い、質問させていただきます。

よろしくお願いします。


CC BY-SA 3.0
2018-02-21T22:26:19.823
41906
2018-02-22T16:01:22.207
14631
question
kotlin
Kotlinのsingletonを初期化する方法


初期化ブロック (`init`) を利用するのはどうでしょうか

サンプル：

[code]

    object Singleton {
        val message: String
        // ここで初期化を行う
        init {
            message = "Hello, world!"
            println("init complete")
        }
        fun hello() {
            println(message)
        }
    }
    
    fun main(args: Array<String>) {
        Singleton.hello()
        Singleton.hello()
    }
    
[/code]

出力結果：

[code]

    init complete
    Hello, world!
    Hello, world!
    
[/code]


CC BY-SA 3.0
2018-02-22T16:01:22.207
41933
2018-02-22T16:01:22.207
2391
41906
answer