Scala'da özel ve korumalı yapıcı


109

Scala'da açık bir birincil kurucuya sahip olmamanın, sadece sınıf gövdesinin içeriğinin etkisini merak ettim.

Özellikle, özel veya korumalı kurucu örüntüsünün, yani tamamlayıcı nesne veya başka bir sınıf veya nesnenin yöntemleri aracılığıyla yapıyı kontrol etmenin bariz bir uygulaması olmayabileceğinden şüpheleniyorum.

Yanlış mıyım? Varsa nasıl yapılır?


Bir Scala tekliğiniz olabilir (yani, nesne anahtar kelimesi ile) ve sınıfınızı bu tekil içinde özel olarak tanımlayabilir ve nesnelerinizi oluşturmak için tekli yöntemlere sahip olabilirsiniz.
Paggas

@Paggas, maalesef kapsamının dışında özel olarak işaretlenmiş bir sınıfın örneğini döndürdüğünüzde, kapsam eş nesnesinin bir yönteminden döndüğünde bile derlenmez.
Don Mackenzie

Bu, Scalaz kaynak kodu boyunca oldukça bol bir şekilde yapılır. Kavram aynı zamanda soyut cebirsel veri türü olarak da bilinir .
Tony Morris

Yanıtlar:


190

Sınıf adı ve parametre listesi arasına uygun anahtar kelimeyi şu şekilde ekleyerek varsayılan kurucuyu özel / korumalı olarak bildirebilirsiniz:

class Foo private () { 
  /* class body goes here... */
}

Teşekkürler Aleksander, Lütfen bana bunun ölçek kitaplarından birinde mi yoksa dil şartnamesinde mi sunulduğunu söyleyebilir misiniz? Maalesef henüz oy veremiyorum.
Don Mackenzie

"Programlama Scala" nın kurucularla ilgili açıklamasına (sayfa 92-95) baktım ve orada bahsedildiğini görmüyorum. Aslında sorunuzun cevabını eski bir değişim günlüğünde buldum, ancak daha önce başka hiçbir yerde bahsedildiğini görmemiştim. Bağlantı: scala-lang.org/node/43#2.4.0
Aleksander Kmetec

18
"Scala'da Programlama" sayfa 414. Wampler'in Programlama Scala'sının 97. sayfası. Subramaniam's Programming Scala, Sayfa 60. Kontrol etmem için şu anda yanımda Scala Başlangıç ​​PDF'si yok.
Daniel C. Sobral

Oh, şimdi 97. sayfada görüyorum. Teşekkürler.
Aleksander Kmetec

1
Hem daha fazla araştırma için teşekkürler, Wampler kitabını aldım, ancak sadece telefonumda ve açıkça tam olarak okumadım, ancak Odersky kitabını şaşırtıcı derecede iyi tamamladığını gördüm.
Don Mackenzie

64

Aleksander'ın cevabı doğru, ancak Scala'da Programlama ek bir alternatif sunuyor:

sealed trait Foo {
 // interface
}

object Foo {
  def apply(...): Foo = // public constructor

  private class FooImpl(...) extends Foo { ... } // real class
}

18
Yıllar sonra gelip şunu söylemek için: Bence bu soruya iyi bir cevap ama soruna kötü bir çözüm. Gelecekteki bir programcı Aleksander'ın kodunu kullanacak olsaydı, "Ah, birincil kurucu özeldir, ancak diğer kurucular değildir" derdi. Programcı Daniel'in kodlarına bakmak olsaydı, Ah, özel olarak varsayılan kurucular işaretlemek için Scala'nın yetersizlik telafi etmek bir fabrika deseni kullanırken" derdi., Scala'nın Bekle edebilirsiniz özel olarak varsayılan kurucular işaretlemek! Ne oluyor burada?!?" Başka bir deyişle, kötü bir WTF / LOC oranı.
Malvolio

20
@Malvolio Tam olarak aynı fikirde değilim. Bu model, yalnızca birincil kurucuyu özel yapmakla kalmaz, aynı zamanda uygulamayı da kullanıcıyı arayüzü (özellik) kullanmaya zorlar. Bunun kendi değeri var. Birinin dili bilmediği için bir şey düşünmesine gelince - piffle! Kenny Tilton'dan alıntı yapacak olursak, lanet dili öğrenin !
Daniel C. Sobral

7
Bir yerlerde bu yaklaşımın newanahtar kelimeyi kullanmamak anlamına geldiğinden bahsedilmelidir .
Travis Parks

1
Bu yaklaşımla ilgili bir uyarı, birisinin kendi uygulamasıyla bir Foo'yu başlatabileceğidir. Bu, inşaatı kontrol etme nedenine bağlı olarak bir avantaj veya dezavantaj olarak görülebilir.
aij

1
@aij Doğru, bu yüzden artık olmayacak şekilde yaptım. :)
Daniel C. Sobral
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.