2011-11-10 14 views
13

オブジェクトのコピーを作成する方法(またはオブジェクトのリストを改善する方法)はありますか? 私は、他のクラスによって拡張されるクラスのカスタムオブジェクトについて説明しています。scala copy objects

は例:

Javaでは
class Foo() { 
    var test = "test" 
} 

class Bar() extends Foo { 
    var dummy = new CustomClass() 
} 

var b = new Bar() 
var bCopy = b.copy() // or something? 
+6

オブジェクトを不変に保つ場合は、コピーを作成する必要はありません。 –

答えて

21

、彼らはこの問題のすべてのスーパークラスでcloneを呼び出すことによって動作clone方法を、解決しようとしたが、これは一般的に壊れたとみなされ、最高の理由のために、避けますルックアップできます(たとえば、here)。

Javaでは一般的に、任意のクラスに対して独自のコピーメソッドを作成する必要があります。これは、フィールドの深いコピーと浅いコピーのようなものを指定できるようにします。

クラスをcase classにすると、copyメソッドが無料になります。あなたは、同時にフィールドのいずれかを更新することができますので、それよりも、実際にはましだ:

case class A(n: Int) 
val a = A(1)   // a: A = A(1) 
val b = a.copy(a.n) // b: A = A(1) 
val c = a.copy(2) // c: A = A(2) 

しかしケースクラスから継承するが廃止されました。

+0

のようなものはありません:JavaではCollections.copy(list1、list2)ですが、その後はscalaですか? – user485659

+1

@ user485659コレクションについて具体的に尋ねている場合は、ドキュメントをチェックして、この種の方法の方法がたくさんあることを確認することができます。 'ArrayBuffer'は例えば' clone'メソッドを持っています。しかし、通常は不変の 'List'を使います.Daniel Sobralが指摘するように、コピーを作る理由はありません。 –

+0

@LuigiPlingeケースクラスのコピーはどのように機能しますか?参照のみで変数をコピーするだけですか、それとも何か他のことをしますか? –