2013-04-20 21 views
5

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 constructorOluşturucu özel durum işleme ve bu anahtar sözcüğünü kullanarak Java

+0

Hangi hatayla karşılaşıyorsunuz? – Thomas

+0

Yayınlanan kod, açıkladığınız şeyin tam tersidir! – NINCOMPOOP

cevap

2

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 */ 
} 
+0

İlk seçenek, bir 'init' işlevi yazmak ve kullanmak mı? –

+0

Üçüncü seçenek için bir kod örneği ekledim. – Antimony

+0

* Bu, keyfi kısıtlamalarla Java'da mümkün değildir *: Kısıtlamaların keyfi olmadığını düşünüyorum;) – NINCOMPOOP

0

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)); 
} 
+0

Bu, filename.isEmpty() 'olduğunda yanlış özel durum türünü atar. – Antimony

0

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 
} 
+0

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? –

İlgili konular