Có sự khác biệt nào giữa trường hợp đối tượng và đối tượng trong scala không?
case
để có mô hình phù hợp, nó chỉ là đường. Thực hiện unapply
bản thân làm công việc.
Có sự khác biệt nào giữa trường hợp đối tượng và đối tượng trong scala không?
case
để có mô hình phù hợp, nó chỉ là đường. Thực hiện unapply
bản thân làm công việc.
Câu trả lời:
Các lớp trường hợp khác với các lớp thông thường ở chỗ chúng nhận được:
equals
vàhashCode
toString
vàscala.Product
. Khớp mẫu, bằng và hashCode không quan trọng lắm đối với singletons (trừ khi bạn làm điều gì đó thực sự suy biến), vì vậy bạn sẽ nhận được nhiều thứ tự, một cách hay toString
và một số phương pháp mà bạn có thể sẽ không bao giờ sử dụng.
object
giống như một người độc thân. Không phải vậy. Thay vào đó, nó chính xác là những gì nó nói, một đối tượng, tức là khai báo và khởi tạo trong một. Điều này giới hạn object
trong một trường hợp duy nhất nếu được xác định trong phạm vi gói, điều này thực sự làm cho nó trở thành một đơn lẻ, nhưng chỉ khi được định nghĩa trong PHẠM VI. Nếu được định nghĩa bên trong một lớp, bạn có thể có nhiều trường hợp như chính lớp đó (nó được khởi tạo một cách lười biếng, vì vậy nó không nhất thiết phải là 1-1). Và những đối tượng bên trong rất có thể được sử dụng làm khóa băm, làm cho mặc định bằng / hashCode rất hợp lý.
case object
lớp học, tại sao đây là câu trả lời đúng?
case class
và a class
. Câu hỏi là về sự khác biệt giữa case object
và object
.
Đây là một điểm khác biệt - các đối tượng trường hợp mở rộng Serializable
đặc điểm, vì vậy chúng có thể được tuần tự hóa. Các đối tượng thông thường không thể theo mặc định:
scala> object A
defined module A
scala> case object B
defined module B
scala> import java.io._
import java.io._
scala> val bos = new ByteArrayOutputStream
bos: java.io.ByteArrayOutputStream =
scala> val oos = new ObjectOutputStream(bos)
oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@e7da60
scala> oos.writeObject(B)
scala> oos.writeObject(A)
java.io.NotSerializableException: A$
extends Serializable
nên làm thủ thuật tương tự mặc dù.
scala> object foo
xác định đối tượng foo
scala> case object foocase
xác định đối tượng foocase
Sự khác biệt nối tiếp:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ không thể chuyển sang scala.Serializable
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: Nối tiếp = foocase
sự khác biệt toString:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
các đối tượng trường hợp hoàn toàn đi kèm với việc triển khai các phương thức toString, bằng và hashCode, nhưng các đối tượng đơn giản thì không. các đối tượng trường hợp có thể được tuần tự hóa trong khi các đối tượng đơn giản không thể, điều này làm cho các đối tượng trường hợp rất hữu ích như các tin nhắn với Akka-Remote. Thêm từ khóa trường hợp trước từ khóa đối tượng làm cho đối tượng tuần tự hóa.
Nó tương tự với case class
và class
, chúng tôi chỉ sử dụng case object
thay vì case class
khi không có bất kỳ trường nào đại diện cho thông tin trạng thái bổ sung.
Chúng tôi biết các đối tượng và "lớp trường hợp" trước. Nhưng "case object" là sự pha trộn của cả hai, nghĩa là nó là một singleton tương tự như một đối tượng và có rất nhiều mẫu soạn sẵn như trong một lớp case. Sự khác biệt duy nhất là bản tóm tắt được thực hiện cho một đối tượng thay vì một lớp.
trường hợp đối tượng sẽ không đi kèm với những điều dưới đây:
Áp dụng, phương pháp không áp dụng. Ở đây không có phương pháp sao chép vì đây là một singleton. Không có phương pháp để so sánh bình đẳng cấu trúc. Không có nhà xây dựng là tốt.