Benim sınıf için File
nesne ve diğeri String
nesnesi alır ve this
anahtar sözcüğünü kullanmak istiyorum iki kurucu var. Uygulamanın işlevi, parametre olarak File
olanıdır ve String
ile this
numaralı telefonu arayacaktır. Şimdi String
alan yapıcıda istisnai kontrol etmek istiyorum ama hata alıyorum, bu ilk satır this
olmalıdır. Hataları nasıl kontrol edebilirim this
'u arayın. Constructor call must be the first statement in a constructor
Oluşturucu özel durum işleme ve bu anahtar sözcüğünü kullanarak Java
cevap
Maalesef bu onların keyfi kısıtlamalara Java sayesinde mümkün değildir:
public Test (String filename) {
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
this(new File(filename)); // error
}
public Test (File f) {
/* implementation here */
}
Bu kesin hatadır:
İşte benim kodudur. İki ana ihtimalin var.
Daha idiomatik Java tekniği, her şeyi fabrika işlevine sarmaktır, böylece istisnayı yakalayabilirsiniz. Fabrika işlevleri de yararlıdır çünkü bunlar polimorfik nesneler oluşturmanıza izin verir ve hangi nesnenin gerçekte oluşturulduğunun ayrıntılarını gizlemenize yardımcı olur.
public static Test create(String filename){
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
return new Test(filename);
}
private Test (String filename) {
this(new File(filename));
}
public Test (File f) {
/* implementation here */
}
Diğer seçenek, yapıcıyı böyle bir kısıtlamanın olmadığı bayt koduna yazmaktır. Maalesef bayt kodu daha az okunabilir ve sürdürülebilir olduğundan, büyük olasılıkla öncelikle Java uygulamasında bytecode miktarını en aza indirmek isteyeceksiniz. Bunu AspectJ gibi Java dışındaki bir dilde de yapabilirsiniz.
Düzenleme: Aslında özel durumları yakalamaya çalışmıyorsanız, üçüncü bir olasılık vardır. Süper yapıcı aramadan önce, denetimleri gerçekleştiren ve sonra süper yapıcı çağrısına bir kukla argüman olarak ileten ayrı bir işlev oluşturarak rasgele kod ekleyebilirsiniz. İlk önce argümanlar değerlendirildiği için, kodunuz önce çalışır, ancak bu bir kesmek gibidir.
public Test (String filename) {
this(doChecks(filename), new File(filename));
}
private static Void doChecks(String filename){
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
return null;
}
public Test (Void dummy, File f) {
this(f);
}
public Test (File f) {
/* implementation here */
}
İlk seçenek, bir 'init' işlevi yazmak ve kullanmak mı? –
Üçüncü seçenek için bir kod örneği ekledim. – Antimony
* Bu, keyfi kısıtlamalarla Java'da mümkün değildir *: Kısıtlamaların keyfi olmadığını düşünüyorum;) – NINCOMPOOP
Hayır, this
numaralı telefonu aramadan önce hataları denetleyemezsiniz. Şartname tarafından yasaklandı. Aslında buna ihtiyacın yoktu. İstisnalar atmak için new File(filename)
izin verin.
düzenleme: biz this
veya oluşturucu içinde super
ya this
veya super
kullanmak durumunda Actually that is what my constructor with the implementation has, it catches the exception may be thrown by file, so I just add the null exception and use this directly in my second constructor?
public Test (String filename) {
this((filename == null || filename.isEmpty()) ? null : new File(filename));
}
Bu, filename.isEmpty() 'olduğunda yanlış özel durum türünü atar. – Antimony
yapıcı ilk deyimi olmalıdır: Ben aizen92 yorumuna gördü. Belirli bir kurucudan istisna atarsanız daha iyidir.
public Test (String filename) {
this(new File(filename));
}
ikinci kurucu
null
geçirerek kaynaklanan herhangi istisna, halletsin.
public Test (File file) {
// exception handling code
// or new instance creation
}
Aslında bu benim yapıcı ile uygulama sahip, bu istisna yakalar dosya tarafından atılmış olabilir, bu yüzden sadece null istisnasını ekleyin ve 'bu' doğrudan ikinci yapımcıda kullanın? –
Hangi hatayla karşılaşıyorsunuz? – Thomas
Yayınlanan kod, açıkladığınız şeyin tam tersidir! – NINCOMPOOP