

変更不能なプロパティはプライマリコンストラクタを介して初期化するしかないと思うのですが、セカンダリコンストラクタで計算した結果を使ってプライマリコンストラクタを呼ぶ方法が分からず困っています。

例として、プロパティ`name`と2つのコンストラクタを持つクラス`Person`を考えてみます。セカンダリコンストラクタで`longName`をスペース区切りでつなぎあわせて、それを`name`の値としたいのですが、プライマリコンストラクタの呼出し(`this`)ではコードブロック中の変数が使えないため、計算した文字列を渡すことが出来ません。

[code]

    class Person(val name: String) {
        constructor(vararg longName: String) /* : this(sj.toString()) */ {
            val sj = java.util.StringJoiner(" ")
            longName.forEach { sj.add(it) }
        }
    }
    
[/code]

`Person`のようなクラスはどう定義すればよいでしょうか？


CC BY-SA 3.0
2017-07-03T12:11:55.457
36070
2021-12-28T09:46:34.570
13199
question
kotlin
セカンダリコンストラクタの引数を加工して変更不能なプロパティの値とするには？


以下で如何でしょうか？

[code]

    class Person {
    
        val name: String
    
        constructor(name: String) {
            this.name = name
        }
    
        constructor(vararg longName: String) {
            name = longName.joinToString(" ")
        }
    }
    
[/code]

今回のケースでは以下の方が簡潔かとは思いますが。

[code]

    class Person(val name: String) {
    
        constructor(vararg longName: String) :
                this(longName.joinToString(" "))
    }
    
[/code]

他にも以下とか。

[code]

    class Person(val name: String) {
    
        private companion object {
            fun doSomething(vararg longName: String): String {
                // 長い処理...
                return longName.joinToString(" ")
            }
        }
    
        constructor(vararg longName: String) : this(doSomething(*longName))
    }
    
[/code]


CC BY-SA 3.0
2017-07-20T12:39:40.567
36542
2017-07-20T12:58:37.850
2017-07-20T12:58:37.850
24475
24475
36070
answer