2010-10-28 31 views
9

Bir kurucudaki Scala 2.8 varsayılan parametrelerini kullanıyorum ve Java uyumluluk nedenleriyle, varsayılan parametreleri kullanan bir no-arg kurucusu istedim.Scala ekstra no-arg kurucu ve varsayılan kurucu parametreleri

Bu çok mantıklı nedenlerle çalışmıyor: Eksik bir şey varsa merak ediyorum

class MyClass(field1: String = "foo", field2: String = "bar") { 
    def this() = { 
     this() // <-- Does not compile, but how do I not duplicate the defaults? 
    } 
} 

. Parametreyi çoğaltmayı gerektirmeyen herhangi bir düşünce var mı?

Teşekkürler!

+1

https://lampsvn.epfl.ch/trac/scala/ticket/4278 –

+1

adresinde bir bilet var. İlk biletimdeki ilk biletimde bu bilet lehine konuştum ve etin tüketildiğini söyledi ravenous tarafından " Özel durumlarda "Kurtlar" dilini mahvetme. Şu an kendisi için her kullanım vakası! – extempore

cevap

12

Gerçekten bunu tavsiye etmem, ancak kurucusuna başka bir parametre ekleyerek bunu yapabilirsiniz: Yalnızca bu kadar açıkça, yine içine bir şey geçebilir çünkü

class MyClass(a: String = "foo", b: String = "bar", u: Unit =()) { 
    def this() { this(u =()) } 
} 

Unit iyi bir seçimdir varsayılan değeri geçme, herhangi bir hata olasılığına izin vermez ve yine de doğru kurucuyu aramanızı sağlar. Sadece biri varsayılan çoğaltmak için istekli iseniz

, bir birim parametre eklemek yerine varsayılan seçilmiş olduğu geçersiz kılma dışında aynı stratejiyi kullanabilirsiniz.

+0

Bu sorunun benim sorumluluğu (çoğaltmayı en aza indirgeme) içinde olduğunu kabul ediyorum, ama harika bir uygulama değil. Cevap için teşekkürler! – jkl

4

olarak meraklı iş çevresinde kesmek ve ben kesmek demek yapın: Varsayılan argüman iç temsil kullanabilirsiniz:

o bu (MyClass.init içinde Sınıfım dahil geçmek için yeterli Bildirim o
class MyClass(field1: String = "foo", field2: String = "bar") { 
    def this() = this(MyClass.init$default$1) 
} 

$ varsayılan 1 $. Kısmi bir açıklama, varsayılan argümanların eşlik eden nesnelerde tutulmasıdır.

4

Bir fabrika yöntemini kullanmayı düşünebilirsiniz:

class MyClass(field1: String, field2: String) { 
    def this() = this(field1="foo", field2="bar") 
} 

Bu:

class MyClass(field1: String = "foo", field2: String = "bar") 
object MyClass { 
    def newDefaultInstance = new MyClass 
} 

Sonra Java dan size varsayılan değerleri belirtmek nereye taşımak için başka olasılık ise MyClass.newDefaultInstance()

çağırabilir stil, özellikle 0-arg kurucuyu bulmak için yansıma kullanan ilkbahar gibi bir çerçeve ile çalışıyorsanız kullanışlıdır.

+0

Fikirler için teşekkürler.Benim durumumda, ilk, bu benim başlattığım bir Servlet olduğu gibi işe yaramaz (bu yüzden argümana ihtiyacım var). İkincisi uygulanabilir, ancak varsayılan değerlerin sağladığını testlerde hoş varsayılan davranışları kaybediyorum. . Öncelikli olmayan kurucuya ihtiyacım olmasaydı, ilkine dönmüş olurdum. – jkl

0

tüm amaçlar için uygun değildir, ancak bir alt sınıf hile yapabilir: Ben, soru anlamak kodu aşağıdaki yanlış değilim

class DefaultMyClass extends MyClass() 
0

me`

class Employee (

    ){ 
    def this(name :String , 

    eid :Int){ 
    this(); 
    } 
} 

için çok iyi çalıştı

İlgili konular