Java 对于条件运算符,表达式不应太复杂

Java 对于条件运算符,表达式不应太复杂,java,android,sonarqube,Java,Android,Sonarqube,我用的是声纳,它给我的建议表达不应该太复杂 如何更好地表示以下代码 代码 这些条件都与eDelivery对象有关,因此请在此处进行处理 首先,有一个问题,为什么要对看起来应该是布尔的属性执行所有这些parseBoolean调用。但好吧,让我们假设你不能改变这一点。很好,所以添加第二种方法: public class EDelivery { public boolean isReceiveConfirmationElectronically() { return Boolean.pa

我用的是声纳,它给我的建议表达不应该太复杂

如何更好地表示以下代码

代码


这些条件都与eDelivery对象有关,因此请在此处进行处理

首先,有一个问题,为什么要对看起来应该是布尔的属性执行所有这些parseBoolean调用。但好吧,让我们假设你不能改变这一点。很好,所以添加第二种方法:

public class EDelivery {

  public boolean isReceiveConfirmationElectronically() {
    return Boolean.parseBoolean(getReceiveConfirmationElectronically())
  }

  // &etc...
这已经大大地清理了它:

if (eDelivery != null && eDelivery.isReceiveConfirmationElectronically() &&
                        !eDelivery.isInvalidEmailAddress() && !eDelivery.isEmailUndeliverable() &&
                        eDelivery.getUserEmailAddress() != null && !eDelivery.getUserEmailAddress().isEmpty()) {
                    // Implementation code
但这并不能解决条件的数量问题。所以现在:

  // in EDelivery class
  public boolean isEmailGood() {
    return !isInvalidEmailAddress() && !isEmailUndeliverable() &&
                        getUserEmailAddress() != null && !getUserEmailAddress().isEmpty())
  }
所以现在我们在:

if (eDelivery != null && eDelivery.isReceiveConfirmationElectronically() &&
                        eDelivery.isEmailGood()) {
                    // Implementation code
此时,您已经满足了要求,但如果您想更进一步:

  // in EDelivery class
  public boolean canSendElectronicConfirmation(){
    return isEmailGood() && isReceiveConfirmationElectronically();
  }
这会将原始的if语句缩减为

if (eDelivery != null && eDelivery.canSendElectronicConfirmation()) {
                    // Implementation code

试着阅读这篇文章,把你的条件分解成小函数,保持原样。我不觉得这很难理解。声纳错误的解释是条件的数量。它甚至为您提供了重构的示例。此外,getUserEmailAddress!=空&!getUserEmailAddress.isEmpty可以在CommonsLang、Guava、Android、Google Base等多种情况下缩短……在检查此规则时,有没有办法将SonarQube配置为忽略Equals和Hashcode方法?或者我们应该手动将这些标记为忽略或误报?这些方法通常是自动生成的,即使是一个只有5或6个字段的简单域对象,也很容易有一个超过最小条件数的equals方法。想法?@KevinM你确定你在说同样的规则吗?我不记得看到过一个自动生成的Equals方法,它在一个长条件下测试每个字段。例如,如果您有6个pojo类级别的变量,然后使用IDE生成一个使用所有字段的Equals方法,这将导致至少6个条件。我可能应该尝试简化equal意味着什么的逻辑。但在某些情况下,例如在使用持久性框架时,在保存对象之前,并不总是有标识符。因此,必须有一个equals方法来比较所有字段,而不仅仅是id
if (eDelivery != null && eDelivery.canSendElectronicConfirmation()) {
                    // Implementation code