2011-11-12 22 views
6

Bazı kodları çalıştırmak için anonim bir iç sınıf kullanırken Java'da Özel Durum Saydamlığı elde etmenin en iyi yolu nedir?Anonim İç Sınıf İçerisindeki İşaretli İstisnalar Atma

Gerçek kodda gördüğüm sık bir desen, belirli bir kod için bazı bağlamları belirtmek için bazı sözde Çalışabilir tip arabirim kullanıyor. JDK'da düşünebileceğim en iyi örnek, java.security.PrivilegedExceptionAction.

try { 
    boolean success = AccessController.doPrivileged(
     new PrivilegedExceptionAction<Boolean>() { 
      @Override 
      public Boolean run() throws Exception { 
       // do something 
       // read file 
       FileInputStream fileInputStream = 
        new FileInputStream(new File("someFile")); 
       return true; 
      } 
     } 
    ); 
} catch (PrivilegedActionException e) { 
    if (e.getCause() instanceof FileNotFoundException) { 
     // handle IO exception 
    } else { 
     // impossible no other checked exception 
    } 
} 

olsa kod açıkça iç kod yalnızca bulunmayan bir dosya atar görebilirsiniz, ama arayan istisnası aslında atılır habersiz olduğu gibi kontrol ettik istisnalar faydalarını kaybetti okuma. Ortak bir hata, yeni bir istisna atmak için kodun anonim bir iç sınıfa tanıtılması ve kodun bu istisnayı ele almak için zorlayamayacağı olacaktır.

İstediğim şey, aşağıdaki gibi bir şeydir, bir dil değişikliği olmadan erişilebilen bu davranış şeklidir?

public interface PrivilegedExceptionAction<T,V... extends Throwable> 
{ 
    public T run() throws V; 
} 
+0

Anonim iç sınıfların genel olarak kötü bir fikir olduğunu düşünüyorum; çünkü bunlar çoğunlukla yeniden kullanılamaz veya genişletilemez. Ama bu başka bir nedendir. Ben de herhangi bir cevapla ilgileniyorum. – user949300

+0

http://blogs.sun.com/briangoetz/entry/exception_transparency_in_java ben proje lambda altında Brian'ın önerisini gördük – alexsmail

+0

üzerinde bir göz atın, ne yazık ki bu 6 – bluphoenix

cevap

3

Neden göremiyorum. Aşağıdaki kod çalıştı.

interface RunIt < E extends Exception > 
{ 
    void run () throws E ; 
} 

class App 
{ 
    public static void main (String [ ] args) 
    { 
     RunIt <RuntimeException> r = new RunIt <RuntimeException> () 
     { 
      public void run () 
      { 
       throw new RuntimeException () ; 
      } 
     } ; 
     r . run () ; 
    } 
} 
+0

Birden fazla istisna atmanız gerekiyorsa ne yapardınız? Bir RunIt2 'u genişletir. Sanırım bu o kadar da kötü değil. Atmak için beklediğim istisnai durumlara bağlı olarak hangi Arabirimin kullanılacağını seçmeliyim. – bluphoenix

+0

Birden fazla özel durum atmanız gerekirse, 2 seçenek vardır. (1) E1'in istisna süresini uzattığını söylediğiniz gibi, E2 istisnayı uzatır. (2) E atılabilir tüm istisnalar süper bir sınıf olmak için seçebilirsiniz. 1'i seçerseniz, arabirim RunIt emory

İlgili konular