web-dev-qa-db-ja.com

Kotlinの基本オブジェクトを変更せずに、オブジェクトを別のオブジェクトに複製するにはどうすればよいですか?

これは私のコードです:

var header1: Record? = null
var header2: Record? = null

header2 = header1
header2.name = "new_name"

だが header1.nameも変わります!

12

同じオブジェクト(同じメモリのチャンク)を別の変数に割り当てているだけです。どういうわけか新しいインスタンスを作成してすべてのフィールドを設定する必要があります。

header2 = Record()
header2.name = header1.name

ただし、Kotlinでは、Recordクラスが Data class の場合、Kotlinがコピーメソッドを作成します。

data class Record(val name: String, ...)
...
header2 = header1.copy()

また、copyメソッドを使用すると、オーバーライドする必要のあるフィールドをオーバーライドできます。

header2 = header1.copy(name = "new_name")
23
Josef Adamcik

変数の新しいインスタンスを作成し、すべてのフィールドを初期化する必要があります。 _header2 = header1_だけを実行すると、_header1_の参照も_header2_に渡されます。

例(Java):

_public Record(Record record) {
    this.name = record.name;
}
_

次に、次のように呼び出します:header2 = new Record(header1);

参照: Is Java "pass-by-reference"または "pass-by-value"?

2番目のオブジェクトを完全に同じにする必要がある場合、または一部のフィールドを変更する必要がある場合は、copyメソッドを使用する2つのオプションがあります。

val alex = User(name = "Alex", age = 1)
val olderAlex = jack.copy(age = 2)

またはKotlinは、オブジェクトを構築するための優れた構文を取得しました。

createSomeObject(obj = ObjInput(name = objName,
                    password = UUID.randomUUID().toString()
                    type = listOf(TYPE)))

実際、あなたのケースでは最初のものを使用する方が簡単なようですが、このタスクを解決するための2番目の方法について知っておくと良いでしょう。

1
Dawid Kubicki