2011-07-15 18 views
1

私はいくつかのモジュールを含むプロジェクトに取り組んでいます。私は、すべてのモジュールで内部構造を静的に生成するカスタム例外を持つ能力を提供したいと考えています。カスタムerror_code-error_messageペアを持つプロパティファイルからのHashMap。 は、私は、静的プロパティが含まれているものをベース抽象カスタム例外があります。Javaの継承と静的メンバー

public abstract class AbstractException extends RuntimeException{ 
    public static Map<String, String> ERRORS = new HashMap<String, String>(); 
    public String code; 
    // getters and setter for code ommited 

    public static init(String fileName, Class<?> clazz){ 
    // read properties file 
    // populate map 
    } 

    public static String getMessageByCode(String code){ 
    // 
    String mess = ERRORS.get(code); 
    // in case of null message provide default message about unknown error 
    } 

    public AbstractException(String code){ 
     super(getMessageByCode(code)); 
     this.setCode(code); 
    } 

    public AbstractException(Throwable thr){ 
     super(getMessageByCode("ERROR_999"), thr); 
     this.setCode(code); 
    } 

    public AbstractException(Throwable thr, String msg){ 
     super(getMessageByCode("ERROR_999") + " " + msg, thr); 
     this.setCode(code); 
    } 

} 

シンプルなカスタム例外

public class MyException extends AbstractException{ 
static{ 
    // populate internal map with module-specific errors 
    init("module1.errors.properties", MyException.class); 
}  

public MyException(String code){ 
super(getMessageByCode()); 
} 
// rest code omited 

} 
コードでカスタム例外の

簡単な使い方:

throw new MyException("ERROR_404"); 

Propblems何私ができますこのコードを参照してください:

  1. 抽象例外のすべての子クラスに対してエラーマップが存在する
  2. 静的エラーフィールドへの同時アクセス。

質問は、これらの問題を回避する方法は、誰かが私の問題のより良い解決策を持っている可能性がありますか?

+1

モジュール間でエラーメッセージを共有したいですか? –

+0

静的エラーへの同時アクセスでは、どのような問題がありますか?それらの静的メンバーのための読み書きはダーティーではありませんか? –

+0

代わりに 'java.util.logging'を使うべきでしょう。あなたは本当にそれらのエラーを記憶しておく必要がありますか? – toto2

答えて

1

ERRORSのコピーが1つしかなく、すべてのサブクラスで共有されるため、このデザインは機能しません。 1つの可能な解決策は、さまざまなERRORSマップを管理するExceptionFactoryであり、必要なサブクラスを作成して例外を作成することができます。たとえば、

public static class AbstractException extends RuntimeException 
{ 
    String code; 
    String message; 
    public void setCode(String code) { this.code = code; } 
    public void setMessage(String message) { this.message = message; } 
} 

public static class MyException1 extends AbstractException{ } 

public static class MyException2 extends AbstractException{ } 

public static class ExceptionFactory 
{ 
    private Map<Class<?>,Map<String,String>> errorMaps = new HashMap<Class<?>, Map<String,String>>(); 
    public void register(Class<? extends AbstractException> exType, String fileName) 
    { 
     Map<String,String> errors = new HashMap<String,String>(); 
     // load errors from fileName 
     errorMaps.put(exType, errors); 
    } 

    public <T extends AbstractException> T newException(Class<T> exType, String code) 
    { 
     Map<String,String> map = errorMaps.get(exType); 
     String message = map.get(code); 
     T ex; 
     try 
     { 
      ex = exType.newInstance(); 
      ex.setCode(code); 
      ex.setMessage(message); 
      return ex; 
     } 
     catch(InstantiationException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     catch(IllegalAccessException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
}