gpt4 book ai didi

java - Java中如何统一有效性检查和异常抛出?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:15 25 4
gpt4 key购买 nike

我正在实现一个接口(interface),该接口(interface)定义了一个方法,该方法可以在参数无效时抛出异常。什么构成有效参数取决于实现类。该接口(interface)还定义了一个 isValid() 方法,该方法可用于检查参数但返回一个 boolean 值而不是抛出异常。我发现实现这两种方法会导致大量重复。考虑这个虚构的例子:

public class Something implements SomeInterface {

// Other class stuff

public void doTheThing(SomeParameter sp) throws SpecificRuntimeException {
if(sp == null) throw new ParameterCannotBeNullException();
if(sp.getNonZeroInt() == 0) throw new ShouldBeNonZeroException();
if(!sp.someOtherCondition()) throw new SomeConditionNotMetException();

...
}

public boolean isValid(SomeParameter sp) {
if(sp == null) return false;
if(sp.getNonZeroInt() == 0) return false;
if(!sp.someOtherCondition()) return false;

...
return true;
}
}

问题是两种方法中的检查必须一致,并且本质上是重复的逻辑。我一直在尝试合并检查,以便两种方法使用相同的检查,但行为仍然保留。我考虑的一些事情:

  1. doTheThing() 中有行 if(!isValid(sp) throw new RuntimeException();
  2. 将异常抛出部分分离到一个单独的私有(private)方法中,例如 checkParameter() 并在 isValid() 中执行: try { checkParameter(sp);返回真; } catch (SpecificRunTimeException e) { 返回 false; }

1. 的问题是丢失了具体的异常,我想提供尽可能详细的异常。 2. 的问题是使用异常机制似乎......不知何故错误。这部分代码可能对性能敏感,我不想依赖从根本上比它需要的慢的东西(如果我必须这样做的话)方式和分析没有显示问题,很公平......但如果有问题怎么办?)。还是以这种方式使用异常对性能的影响可以忽略不计?

重构此代码以使用相同的有效性检查逻辑的最佳方法是什么?

最佳答案

如果您创建一个返回 bean 的 isValidParam 方法会怎样:

class ValidBean {
private boolean isValid;
private Exception exceptionOnInvalid;
public ValidBean(boolean isValid, Exception exceptionOnInvalid) {...}
// accessors
}

方法是:

private ValidBean isValidParam(SomeParameter sp) {
if (sp == null) {
return new ValidBean(false, new ParameterCannotBeNullException());
}
if (sp.getNonZeroInt() == 0) {
return new ValidBean(false, new ShouldBeNonZeroException());
}
if (!sp.someOtherCondition()) {
return new ValidBean(false, new SomeConditionNotMetException());
}

return new ValidBean(true, null);
}

然后你做:

public boolean isValid(SomeParameter sp) {
return isValidParam(sp).isValid();
}

public void doTheThing(SomeParameter sp) throws SpecificRuntimeException {
ValidBean validbean = isValidParam(sp);
if (! validBean.isValid()) {
throw validBean.getExceptionOnInvalid();
}
...
}

关于java - Java中如何统一有效性检查和异常抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2085569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com