'in nesi geçersiz kılınabilir kurucular yöntemi çağırır?
Sayfa Başlığı soyut bir yöntem sonucuna bağlı olarak ayarlayan Wicket sayfa Dersim var.
public abstract class BasicPage extends WebPage {
public BasicPage() {
add(new Label("title", getTitle()));
}
protected abstract String getTitle();
}
Eclipse mesajı ile beni uyarıyor "geçersiz kılınabilir bir yöntem oluşturucu çağrısı", ama ne olmalıdır? Tahmin edebiliyorum tek alternatif, alt sınıflar süper kurucusuna aksi takdirde soyut yöntemler sonuçlarını iletmektir. Ama bu çok parametre ile okumak zor olabilir.
CEVAP
Kurucular itibaren geçersiz kılınabilir bir yöntem çağırma
Basitçe söylemek gerekirse, bu kadar gereksiz yere olanakları, çünkü yanlışBİRÇOKböcekler. @Override
çağrıldığında, nesne durumu tutarsız ve/veya eksik olabilir.
Bir alıntıEtkili Java 2. Baskı, Madde 17: miras için Tasarım ve belge veya yasaklamak başka:
Bir itaat sınıf kalıtım sağlamak için gereken birkaç kısıtlamalar vardır.Kurucular geçersiz kılınabilir yöntemleri çağırmak gerekirdoğrudan ya da dolaylı olarak. Eğer bu kuralı ihlal ederseniz, program hatası neden olur. Üst sınıf yapıcısı, alt sınıf yapıcısı önce ishal, alt sınıfta geçersiz kılma yöntemi, alt sınıf yapıcısı tükendi önce çağrılır. Eğer geçersiz kılma yöntemi herhangi bir başlatma, alt sınıf yapıcısı tarafından gerçekleştirilen bağlıdır, bu yöntem beklendiği gibi davranır.
Burada göstermek için bir örnek:
public class ConstructorCallsOverride {
public static void main(String[] args) {
abstract class Base {
Base() { overrideMe(); }
abstract void overrideMe();
}
class Child extends Base {
final int x;
Child(int x) { this.x = x; }
@Override void overrideMe() {
System.out.println(x);
}
}
new Child(42); // prints "0"
}
}
Base
çağrı yapıcı ne zaman buraya overrideMe
, Child
final int x
başlatma tamamlandıktan ve yöntemi yanlış değerini alır. Bu neredeyse kesinlikle hatalar ve hatalara yol açacaktır.
İlgili sorular
- Calling an Overridden Method from a Parent-Class Constructor
- State of Derived class object when Base class constructor calls overridden method in Java
- Using abstract init() function in abstract class’s constructor
Ayrıca Bkz
Birçok parametre ile nesne yapımı
Birçok parametrelerle kurucular zavallı okunabilirlik yol açabilir, ve daha iyi seçenekler var.
İşte bir alıntıEtkili Java 2. Baskı, Madde 2: çok yapıcı parametreleri ile karşı karşıya builder deseni Düşünün:
Geleneksel olarak, programcılar kullanmışteleskopik yapıcıyalnızca gerekli parametreleri ile bir kurucu verdiğiniz desen, başka bir isteğe bağlı parametre, iki isteğe bağlı parametreler ile, ve benzeri... üçüncü bir tek
Teleskopik kurucu desen aslında böyle bir şey
public class Telescope {
final String name;
final int levels;
final boolean isAdjustable;
public Telescope(String name) {
this(name, 5);
}
public Telescope(String name, int levels) {
this(name, levels, false);
}
public Telescope(String name, int levels, boolean isAdjustable) {
this.name = name;
this.levels = levels;
this.isAdjustable = isAdjustable;
}
}
Ve şimdi aşağıdakileri yapabilirsiniz:
new Telescope("X/1999");
new Telescope("X/1999", 13);
new Telescope("X/1999", 13, true);
Ancak, şu anda sadece name
ve 15* *varsayılan levels
terk edebilirsiniz. Sen-ebilmek sağlamak daha yapıcı aşırı, ama belli sayıda ki patlayacak gibi parametre sayısı büyür, ve hatta birden fazla boolean
int
argümanlar, hangi gerçekten bir karışıklık çıkmış şeyler.
Bu yaz için hoş bir desen değil görmek, ve her zaman daha keyifli olarak Ne ("gerçek" ne demek? 13?).
Bloch bunun yerine gibi bir şey yazmak için izin verecek builder desenini kullanarak önerir
Telescope telly = new Telescope.Builder("X/1999").setAdjustable(true).build();
Şimdi parametreleri olarak adlandırılır unutmayın, ve istediğiniz herhangi bir sırayla onları ayarlayabilirsiniz, ve varsayılan değerleri saklamak istediğiniz olanları atlayabilirsiniz. Bu özellikle aynı tür pek çok ait parametreler çok sayıda var elbet teleskopik kurucular çok daha iyi.
Ayrıca Bkz
- Wikipedia/Builder pattern
- Etkili Java 2. Baskı, Madde 2: çok yapıcı parametreleri ile karşı karşıya builder deseni Düşünün(excerpt online)
Neden't ben açıkça bir yöntemi ge...
Adedi: non-geçersiz kılınabilir üye Ge...
NSLog bir nesne's bellek adresi g...
Maymun bir yöntem yama, yeni uygulama ...
ObjC Kategori üzerinden bir yöntemi ge...