Büyük / küçük harf nesnesi ve nesne arasındaki fark


226

Skala nesnesi ile scala'daki nesne arasında herhangi bir fark var mı?


3
Bir noktası var - üzerinde desen eşleşmesi için bir vaka nesnesine sahip olmak gerekli değildir. Sanırım bu bir önceki soruda ele alınmadı ...
axel22

3
Desen eşleştirme davranışında bir fark olacağını düşündüm, ancak hem bir vaka nesnesi hem de normal bir nesne, bir desen eşleşmesi AFAIK'de aynı şekilde davranıyor. Vaka nesneleriyle ilgili herhangi bir bilgi bulmak oldukça zor, bu yüzden bizi aydınlatan birini dört gözle bekliyorum.
Yaş Mooij

4
caseDesen eşleşmesine sahip olmak gerekli değildir , sadece şekerdir. unapplyKendinizi uygulamak işi yapar.
Raphael

1
Kabul edilen cevap, üzerinde yorumlarda tartışıldığı gibi soruya cevap vermez. Fark yaratmak için çok geç, ancak not edilmelidir.
itsbruce

Kabul edilen cevabı düzenlemek için çok geç değil. Düzenleme incelenecek ve ilgili ise kabul edilecektir.
C4stor

Yanıtlar:


112

Vaka sınıfları, aldıkları için normal sınıflardan farklıdır:

  1. desen eşleştirme desteği
  2. varsayılan uygulamaları equalsvehashCode
  3. varsayılan serileştirme uygulamaları
  4. daha güzel bir varsayılan uygulaması toStringve
  5. otomatik olarak devralınan küçük işlevsellik miktarı scala.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ş toStringve muhtemelen hiç kullanmayacağınız bazı yöntemler elde edersiniz.


46
Bu cevabın 3. ve 4. maddeleri büyük / küçük harf nesneleri ve nesneler arasındaki doğru farktır. Nokta 1 ve 2 tekil nesneler için önemli değildir. Ve singleton nesneleri her zaman 0 değerli ürünlerdir, bu nedenle nokta 5 de önemli değildir.
Wojciech Durczyński

86
Bu yazı 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.
nilskp

66
Soru case objectsınıfla ilgili değil, neden doğru cevap bu?
Ixx

10
Bu soruya cevap vermiyor. Bu cevap case classve a arasındaki farkla ilgilidir class. Soru, case objectve arasındaki farkla ilgilidir object.
MK

6
@ C4stor Yine de cevap bunu söylemiyor. Nesne bir sınıf değildir. Vaka sınıflarının sahne arkasında oldukça fazla büyü yaptığı göz önüne alındığında, Scala'nın çeşitli uç vakaları ve komplikasyonları göz önüne alındığında, standart bir Scala nesnesi ile bir vaka nesnesi arasındaki tek farkın fark hakkında bildiklerimizle açıklandığını varsaymak için hiçbir neden yoktur. standart sınıflar ve vaka sınıfları arasında. Bu cevap, soruya bile değinmez.
itsbruce

137

İş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$

15
Vaka nesneleri serileştirilebilir özellikle aktörler arasındaki ağ iletişiminde normal nesnelerden en fazla fark olduğunu düşünüyorum
爱国者

14
Ekleme extends Serializableyine de aynı hile yapmalıdır.
nilskp

36
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


2

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.


0

Bu ile benzer case classve classbiz sadece kullanmak, case objectyerine case classek durum bilgileri temsil eden herhangi alanlar olmadığında.


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.