Điều này thực sự phụ thuộc vào việc bạn có cần chia sẻ bộ sưu tập đó một cách rộng rãi hay không. Lợi thế của một bộ sưu tập có thể thay đổi là nó thường nhanh hơn bộ sưu tập bất biến, và dễ dàng hơn để có một đối tượng duy nhất để vượt qua thay vì phải đảm bảo bạn có thể đặt var từ các ngữ cảnh khác nhau. Nhưng kể từ khi họ có thể thay đổi ra từ dưới bạn, bạn phải cẩn thận ngay cả trong một bối cảnh đơn luồng:
import collection.mutable.ArrayBuffer
val a = ArrayBuffer(1,2,3,4)
val i = a.iterator
i.hasNext // True
a.reduceToSize(0)
i.next // Boom!
java.lang.IndexOutOfBoundsException: 0
at scala.collection.mutable.ResizableArray$class.apply(ResizableArray.scala:43)
...
Vì vậy, nếu nó sẽ được sử dụng rộng rãi, bạn nên xem xét liệu bạn có thể một cách thích hợp cẩn thận để tránh vấn đề như thế này Nói chung là an toàn hơn khi sử dụng một số var
cho một bộ sưu tập bất biến; sau đó bạn có thể nhận được lỗi thời, nhưng ít nhất bạn sẽ không rơi vào khuôn mặt của bạn với một segfault.
var v = Vector(1,2,3,4)
val i = v.iterator
i.hasNext // True
v = Vector[Int]()
i.next // 1
Bây giờ, tuy nhiên, bạn phải vượt qua v
như một giá trị trả về từ bất kỳ phương pháp nào có thể sửa đổi nó (bên ngoài của lớp chứa nó, ít nhất).Điều này cũng có thể gây ra vấn đề nếu bạn quên cập nhật các giá trị ban đầu:
var v = Vector(1,2,3,4)
def timesTwo = v.map(_ * 2)
timesTwo
v // Wait, it's still 1,2,3,4?!
Nhưng sau đó điều này không cập nhật hoặc, nó ?:
a.map(_ * 2) // Map doesn't update, it produces a new copy!
Vì vậy, như một quy luật chung,
- hiệu suất đòi hỏi bạn phải sử dụng một - sử dụng nó
- phạm vi địa phương trong phạm vi một phương pháp - sử dụng bộ sưu tập có thể thay đổi
- chung với chủ đề/lớp khác - sử dụng bộ sưu tập bất biến
- thực hiện trong một lớp học, mã đơn giản - sử dụng bộ sưu tập có thể thay đổi
- thực hiện trong một lớp học, mã phức tạp - sử dụng bất biến
nhưng bạn nên có thể vi phạm điều này thường xuyên khi bạn dính vào nó.
Nếu không có nhiều ngữ cảnh hơn, nó không thực sự tạo sự khác biệt. Không phải là cách tiếp cận chức năng. Bộ sưu tập có thể thay đổi sẽ có thể hoạt động tốt hơn so với var không thay đổi. – dbyrne
@dbyrne * Bộ sưu tập có thể thay đổi sẽ có thể hoạt động tốt hơn so với biến thể không thay đổi * whoa? không phải hai người chơi trong cùng một đội? ví dụ. 'val misterMutableCollection = collection.mutable ....' –
@ om-nom-nom Với một var không thay đổi, bạn sẽ phải xây dựng một bộ sưu tập hoàn toàn mới và trao đổi nó. Với một val có thể thay đổi, bạn có thể sử dụng bộ sưu tập gốc và các phương thức gọi để thay đổi nó. – dbyrne