, ama bir şey Scala yöntemler ve alanlar arasındaki çizgiyi bulanıklaştırır olmasıdır. Mesela ben ... böyle bir sınıf inşa edebilirsinizScala Özellikleri Soru
class MutableNumber(var value: Int)
Burada anahtar yapıcı-argüman var otomatik beni java bir alıcı/setter gibi 'değer' alanını kullanın olanak sağlamasıdır. API etmiyor beri
// require all mutable numbers to be >= 0
class MutableNumber(private var _value: Int) {
require(_value >= 0)
def value: Int = _value
def value_=(other: Int) {
require(other >=0)
_value = other
}
}
istemci tarafında kod sonu yok: Ben kısıtlamaları eklemek istiyorsanız
// use number...
val num = new MutableNumber(5)
num.value = 6
println(num.value)
, ben örnek-alanların yerine yöntemleri kullanarak geçiş yapabilirsiniz 't değiştirin:
// use number...
val num = new MutableNumber(5)
num.value = 6
println(num.value)
Benim asmak-up Scala-2,8 eklendi adlı parametreli özelliği ile olduğunu. Ben adında-parametreleri kullanırsanız, benim API değişiklik yapar ve api kırmak yapar.
val num = new MutableNumber(value=5) // old API
val num = new MutableNumber(_value=5) // new API
num.value = 6
println(num.value)
Bunun için herhangi bir zarif çözüm var mı? MutableNumber sınıfımı nasıl tasarlamalıyım, böylece API'yi kırmadan daha sonra kısıtlamalar ekleyebilirim?
Teşekkürler!
İlginç içinde herhangi sınıfın tüm üyelerinde değişiklik yapabilir! Bu yüzden kurucuyu gizleyerek herkesi tamamlayıcı nesneyi kullanmaya zorluyorum. Eğer MutableInteger'in kendisini bir vaka sınıfı yapmak istiyorsam?Sınıf tanımının önüne 'case' koyarsam, Scala'nın eşlik eden nesneyi kendim için otomatik olarak oluşturduğunu biliyorum ... bu çözüm hala işe yarayacak mı? – shj
Evet, bir vaka sınıfı için açıkça tanımlanmış bir eşlik nesnesine sahipseniz, o nesnenin üyeleri oluşturulan dosyaya birleştirilir (örneğin, bir tweaked "Companion.apply()" yöntemini sağlamak istiyorsanız, geçersiz kılınabilir) ama autogenerated 'unapply' tutun. –
@shj - Hayır, bu işe yaramaz çünkü vaka sınıfları yapıcı değişkenlerine doğrudan (korumasız) erişmeyi kabul eder. Bunu yapıyorsun çünkü muhafızları istiyorsun (bu durumda 'require (_value> = 0) 'şeklinde). –