Skala nesnesi ile scala'daki nesne arasında herhangi bir fark var mı?
case
Desen eşleşmesine sahip olmak gerekli değildir , sadece şekerdir. unapply
Kendinizi uygulamak işi yapar.
Skala nesnesi ile scala'daki nesne arasında herhangi bir fark var mı?
case
Desen eşleşmesine sahip olmak gerekli değildir , sadece şekerdir. unapply
Kendinizi uygulamak işi yapar.
Yanıtlar:
Vaka sınıfları, aldıkları için normal sınıflardan farklıdır:
equals
vehashCode
toString
vescala.Product
. Desen eşleştirme, eşittir ve hashCode, tek tonlar için çok önemli değildir (gerçekten dejenere bir şey yapmadıkça), bu yüzden hemen hemen sadece serileştirme, hoş toString
ve muhtemelen hiç kullanmayacağınız bazı yöntemler elde edersiniz.
object
, singleton ile aynı efsaneyi devam ettiriyor . O değil. Daha ziyade tam olarak söylediği şey budur, bir nesne, yani birinde bir beyan ve örnekleme. Bu object
, paket kapsamında tanımlandığı takdirde tek bir örnekle sınırlandırır , bu da onu etkili bir şekilde tek ton haline getirir, ancak yalnızca BU KAPSAMDA tanımlanmışsa. Bir sınıf içinde tanımlanmışsa, sınıfın kendisi kadar çok örneğe sahip olabilirsiniz (tembel bir şekilde başlatılır, bu nedenle mutlaka 1-1 değildir). Ve bu iç nesneler karma anahtarları olarak çok iyi kullanılabilir, bu da varsayılan eşittir / hashCode'u çok mantıklı kılar.
case object
sınıfla ilgili değil, neden doğru cevap bu?
case class
ve a arasındaki farkla ilgilidir class
. Soru, case object
ve arasındaki farkla ilgilidir object
.
İşte bir fark - vaka nesneleri Serializable
özelliği genişletir , böylece serileştirilebilirler. Normal nesneler varsayılan olarak olamaz:
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
yine de aynı hile yapmalıdır.
scala> object foo
tanımlı nesne foo
scala> case object foocase
tanımlı nesne foocase
Serileştirme farkı:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ scala'ya kullanılamaz.Serializable
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: Serileştirilebilir = foocase
toDtring farkı:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
case nesneleri örtük olarak toString, equals ve hashCode yöntemlerinin uygulamalarıyla gelir, ancak basit nesneler bunu yapmaz. büyük nesneler basit nesneler serileştirilebilirken, büyük / küçük harf nesneleri Akka-Remote ile mesajlar olarak çok kullanışlı hale gelir. Case anahtar sözcüğünün önüne object anahtar sözcüğünü eklemek nesneyi serileştirilebilir hale getirir.
Daha önce nesneleri ve "vaka sınıfını" biliyoruz. Ancak "vaka nesnesi" her ikisinin bir karışımıdır, yani bir nesneye benzer bir tekil öğedir ve bir vaka sınıfında olduğu gibi çok sayıda kazan plakası vardır. Tek fark, kazan plakasının bir sınıf yerine bir nesne için yapılmasıdır.
case nesneleri aşağıdakilerle birlikte gelmez:
Uygula, Uygulamayı kaldır. burada tek bir yöntem olduğu için kopyalama yöntemleri yoktur. Yapısal eşitlik karşılaştırması için yöntem yoktur. Yapıcı da yok.