2011-07-15 111 views
1

我正在研究一个包含几个模块的项目。我想在每个模块中提供静态填充内部结构的自定义异常,例如HashMap,来自带有自定义error_code-error_message对的属性文件。 我有一个抽象基自定义异常有什么包含静态属性: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. ERRORS映射存在于所有抽象异常的子类中
  2. 并发访问静态ERRORS字段。

问题是,如何避免这些问题,可能有人对我的问题有更好的解决办法?

+1

您是否想在模块之间共享错误消息? – 2011-07-15 14:38:56

+0

并发访问静态错误时出现什么样的问题?这些静态成员没有脏读/写,不是吗? –

+0

也许你应该使用'java.util.logging'。你真的需要将这些错误记忆在内存中吗? – toto2

回答

1

此设计不起作用,因为只有ERRORS的副本在所有子类中共享。一种可能的解决方案是管理各种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(); 
     } 
    } 
}