Uzatılmış bir sınıfın süper yapıcısına iletilmesi gereken bir kurucuda oluşturulmuş bir nesneye yapılan bir başvuruyu sürdürmenin iyi bir yolu var mı (süper tarafından erişilebilir hale getirilmesinin dışında) sınıf veya yapıcıya parametre olarak geçirme)?Süper yapıcıya aktarılan yeni nesneyi atıfta bulunun
Bir örnekle açıklamama izin verin. aşağıdaki gibi bu sınıf ben istiyorum, Şimdi
class TestA {
TestA(Object foo) {}
}
uzanır: Bu sınıf (ı değiştiremez ve hangi bana foo erişimi vermez olan) al
class TestB extends TestA {
Object myCopyOfFoo;
TestB() {
super(new Object());
}
}
mi var myCopyOfFoo
'da oluşturulan new Object()
'u depolamanın iyi bir yolu var mı? Bu üç fikir
Hiçbiri çalışır:
TestB() {
myCopyOfFoo = new Object();
super(myCopyOfFoo);
}
(Hata: Yapıcı çağrısı bir yapıcı ilk deyimi olmalıdır)
TestB() {
super(myCopyOfFoo = new Object());
}
(Hata: Bir örnek alan myCopyOfFoo atıfta olamaz açıkça bir kurucu) başlatırken
TestB() {
super(makeFoo());
}
Object makeFoo() {
myCopyOfFoo = new Object();
return myCopyOfFoo;
}
(Hata: i atıfta olamaz nstance yöntemi açıkça ben aşağıdakileri yapabileceğini tahmin bir kurucu)
çağırarak, ancak ne iş parçacığı güvenli ne de zarif ise:
static Object tempFoo;
TestB() {
super(tempFoo = new Object());
myCopyOfFoo = tempFoo;
}
kimse benim için daha iyi bir fikir var mı? Ve neden dünyadaki ilk iki düşüncem yasal değil?
Bu zaten her durumda birçok durumda ikinci özel yapıcısı kullanıyorum çünkü aslında güzel kodumu uyan iyi bir çözüm gibi görünüyor. Bu cevabı kontrol etmeyi denemeye başladım, ama yine de çok fazla kod gibi görünüyor.Bundan şüphe duyuyorum, ama daha kısa öneriler olup olmadığını görelim. Ama şimdiden teşekkürler! –
@Markus: * Gerçek * durumunuzun gerçekten bir parametre alması ve bir kopya oluşturması durumunda potansiyel bir öneri sahibiyim. Verdiğiniz kod gerçekten temsilcisiyse (yani hiçbir şeyden yeni bir nesne oluşturuyorsa), diğer önerim yardımcı olmaz. Ama ben onu düzenleyeceğim. –