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

标签 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 类。

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

提前致谢。

最佳答案

the problem with that is many say Exceptions are expensive to create

以可读性换取性能总​​是一个糟糕的交易。 CPU 周期每年都变得更便宜,使得性能效果的值(value)降低。同时,人类对程序的推理能力根本没有得到“升级”,使得可读性变化的负面影响永久存在。因此,您购买的是快速贬值的 Assets 。

当你的程序逻辑要求你报告异常时,最好的办法就是抛出异常。只有当您实际抛出异常时才会有成本,这种情况应该很少发生。

与此同时,不应将异常用于非异常情况(即您预计会经常发生的情况)。最终用户在字段中输入错误数据就是这样一种非异常(exception)情况。当您实现这样的事情时,您展示的第二种方式是正确的做法。

But the problem is unnecessary POJO class.

另一种选择是从“拉模型”切换到“推模型”,此时方法会用不同类型的响应给您回电,而不是您查询响应的状态。这是此方法的框架实现:

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

关于java - 在 Java 中处理验证的好习惯是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28217873/

相关文章:

validation - 导入旧测试帐户时 Paypal 沙箱电子邮件验证失败

c# - 安装 windows 10 creators update 1703 后将数据复制到可移植设备时出现 System.AccessViolationException

java - 我生疏了,不知道如何在 Java swing 中正确处理异常

java - 在 Java 中检索我的文档路径

java - 删除由于最终运算符而导致的代码冗余?

node.js - 验证 Joi 验证已添加到 hapi 路由

java - 我怎样才能运行这个程序?

java - 由于Thread.currentThread().run()而递归调用run方法

java - 如何制作 ArrayList 的单独副本?

spring - Spring验证默认消息