2011-11-10 38 views
13

Có cách nào để tạo một bản sao của một đối tượng (hoặc thậm chí tốt hơn một danh sách các đối tượng) không? Tôi đang nói về các đối tượng tùy chỉnh của các lớp có thể được mở rộng bởi các lớp khác.đối tượng scala copy

dụ:

class Foo() { 
    var test = "test" 
} 

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

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

Lưu ý rằng bạn không cần tạo bản sao nếu bạn giữ đối tượng không thay đổi. –

Trả lời

21

Trong Java, họ đã cố gắng để giải quyết vấn đề này một phương pháp clone, mà hoạt động bằng cách gọi clone trong tất cả các siêu lớp, nhưng điều này thường được coi là bị hỏng và tránh tốt nhất, vì những lý do bạn có thể tra cứu (ví dụ: here). Vì vậy, trong Scala, một cách tổng quát trong Java, bạn sẽ phải tạo phương thức sao chép của riêng bạn cho một lớp tùy ý, điều này sẽ cho phép bạn chỉ định những thứ như sao chép sâu và nông của các trường.

Nếu bạn đặt lớp học là case class, bạn sẽ nhận được phương thức copy miễn phí. Nó thực sự tốt hơn, bởi vì bạn có thể cập nhật bất kỳ trường nào cùng một lúc:

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) 

Tuy nhiên kế thừa từ trường hợp các lớp học bị phản đối.

+0

không có bất cứ điều gì như: Collections.copy (list1, list2) trong Java nhưng sau đó cho scala? – user485659

+1

@ user485659 Nếu bạn đang hỏi cụ thể về các bộ sưu tập, bạn có thể kiểm tra tài liệu và xem có rất nhiều phương pháp cho loại điều này. 'ArrayBuffer' có một phương thức' clone', ví dụ. Nhưng thông thường bạn sẽ sử dụng danh sách bất biến 'List', và như Daniel Sobral chỉ ra, không có lý do gì để tạo một bản sao. –

+0

@LuigiPlinge Bản sao cho các lớp học hoạt động như thế nào? Nó chỉ sao chép các biến bằng cách tham chiếu, hoặc làm cái gì khác? –

Các vấn đề liên quan