我有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类。
请提出一些处理这种情况的方法。
提前致谢。
答案 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);
}
}