Java 减少包含大量if语句的if语句的复杂性

Java 减少包含大量if语句的if语句的复杂性,java,Java,我有一个方法,我需要减少圈复杂度。但我不知道该怎么做 public boolean isEqual(Car car) { if (this.id != car.id) return false; if (this.reg != car.reg) return false; if (this.vin != car.vin) return false; if (this.make != car.make) return false; if (this.mode

我有一个方法,我需要减少圈复杂度。但我不知道该怎么做

public boolean isEqual(Car car) {
    if (this.id != car.id) return false;
    if (this.reg != car.reg) return false;
    if (this.vin != car.vin) return false;
    if (this.make != car.make) return false;
    if (this.model != car.model) return false;

    return true;
}
在方法中有更多类似的if语句,但我只包含了一些。如何降低复杂性? 抱歉,如果格式不正确,因为我在手机上写了这篇文章

您可以执行以下操作:

 public boolean isEqual(Car car) {
 return 
    !(this.id != car.id
    || this.reg != car.reg
    || this.vin != car.vin
    || this.make != car.make
    || this.model != car.model);
 }

真的没有办法让它变得那么干净。正如马龙在评论中所质疑的那样,其实并没有那么复杂。但是,您可以去掉“if”语句,这样读起来会更容易一些:

public boolean isEqual(Car car) {
    return this.Id == car.id &&
           this.reg == car.reg &&
           this.vin == car.vin &&
           this.make == car.make &&
           this.model == car.model;
}

您可以继续在那里添加所需的数量。这有点像你的“如果”语句,当它第二次发现一个“假”结果时,它将停止检查任何其他结果,只返回假结果。

有些人会这样写,更清楚一点(@krillgar也建议这样做)

然而,如果这看起来太长,你应该把它分成更小的“相同性”测试

这些子测试是公开的、受保护的还是私有的,待定


p、 出于偏执,添加一个测试,
car
参数非空

您可以使用第三方库,如Apache Commons lang,它具有以下实用方法:

public boolean isEqual(Car car) {
       return new EqualsBuilder().reflectionEquals(this, car);
    }

但是,询问您是否真的需要比较所有字段:只有在具有相同id(或vin或注册)的情况下,CarA和CarB才能肯定相等


什么意义上的复杂性?@maroun-maroun。就它可以采取的不同路径而言,您是否在使用Java8?这种方法的“危险”是在不同的方法中重复检查属性。诚然,在这种情况下,额外的布尔比较并没有什么大不了的,但如果OP在更复杂的情况下继续这种模式,可能会导致大量开销。reflectionEquals比doing慢一些。不过,在测量相等性的每个字段上追加(lhs,rhs)
public boolean isEqual(Car car) {
   return this.sameMakeAndModel(car) &&
          this.sameRegistrationInfo(car) &&
   ...
}


boolean sameMakeAndModel(Car car) {
   return (this.make == car.make) &&
          (this.model == car.model) &&
          ...    check engine size, colors?
}

boolean sameRegistrationInfo(Car car) {
   return (this.vin == car.vin) &&
          (this.reg == car.reg) &&
          ...    
}
public boolean isEqual(Car car) {
       return new EqualsBuilder().reflectionEquals(this, car);
    }
public boolean isEqual(Car car) {
       //return this.reg= other.reg;?
       //return this.vin= other.vin;?
       return this.id = other.id;
}