在java中处理验证的好习惯是什么

时间:2015-01-29 15:05:12

标签: java validation exception

我有3种方法可以在大多数内部方法中进行验证。我想知道验证是否失败以及验证失败时的错误消息。我知道我可以使用例外来传递错误信息。

 String methodA(parms){
        try{

            return methodB(params);
        }
        catch(UserDefinedRuntimeException ure){
            return ure.getMessage();
        }

    }

    String methodB(params){
        try{    
           return  methodC(params);
        }
        catch(UserDefinedRuntimeException ure){
            throw ure;
        }
        catch(Exception otherException){
            //handle Exception
            otherException.printStackTrace();
        }
    }

    String methodC(params){
          if(params.equals("A")||params.equals("B")||params.equals("C")){
             return dosomething();
          }
          else{
            throw UserDefinedRuntimeException("invalid input :params should be in [A,B,C]");
          }
    }

但问题是很多人说例外创建费用很高

所以我通过谷歌搜索发现了

中提出的另一种方法

Best way to return status flag and message from a method in Java

如下所示..

class Response{
        int status;
        String errMsg;
    }


    String methodA(params){

        Response response = methodB(params);
        if(response.status == 1){
            return "success";
        }
        else{
            return response.errMsg;
        }
    }

    Response methodB(params){
        Response response = methodC(params);
        if(response.status == 0){
            return response;
        }
        else{
            //do processing
            response = new Response();
            response.status =1;
            return response;
        }

    }

    Response methodC(params){
        if(valid(params)){
            //dosomething
            Response response = new Response();
            response.status =1;
            return response;
        }
        else{
            Response response = new Response();
            response.status = 0;
            response.errMsg = "invalid data";
            return response;
        }
    }

但问题是不必要的POJO类。

请提出一些处理这种情况的方法。

提前致谢。

1 个答案:

答案 0 :(得分:3)

  

问题就是很多人说例外创建费用很高

交易可读性对于表现来说总是一件坏事。 CPU周期每年都会降低很多,使性能影响降低。与此同时,人类对程序进行推理的能力并没有得到升级和#34;总之,使可读性的负面影响永久变化。因此,您正在购买快速贬值的资产。

当程序的逻辑要求您报告异常时,最好的方法是抛出异常。只有当您实际抛出一个很少发生的异常时,成本才会存在。

同时,不应对非特殊情况(即您预期会定期发生的情况)使用例外情况。最终用户将错误数据输入字段就是这种非特殊情况。当你实现这样的东西时,你展示的第二种方式是一种正确的方法。

  

但问题是不必要的POJO类。

另一种选择是切换"拉模型"当方法用不同类型的响应回叫你时,而不是你查询状态响应时,推送模型"以下是这种方法的骨架实现:

public interface ResponseHandler {
    void validDataEntered(String data);
    void invalidDataEntered(String data);
}

public class Processor {
    void methodA(String param1, String param2, ResponseHandler h) {
        if (!param1.valid()) {
            h.invalidDataEntered(param1);
            return;
        }
        if (!param2.valid()) {
            h.invalidDataEntered(param2);
            return;
        }
        validDataEntered(param1+":"+param2);
    }
}

public class MainClass implements ResponseHandler {
    Processor p = new Processor();
    public void validDataEntered(String data) {
        System.out.println("Got valid data: "+data);
    }
    public void invalidDataEntered(String data) {
        System.err.println("Got invalid data: "+data);
    }
    public void doSomething() {
        p.methodA("one", "two", this);
    }
}