不确定如何使用这种方法来降低环复杂性。声纳报告为13,而预期为10。我敢肯定,保持这种方法不会造成任何危害,不过,这只是挑战我如何遵循Sonar的法则。任何想法将不胜感激。
 public static long parseTimeValue(String sValue) {
    if (sValue == null) {
        return 0;
    }
    try {
        long millis;
        if (sValue.endsWith("S")) {
            millis = new ExtractSecond(sValue).invoke();
        } else if (sValue.endsWith("ms")) {
            millis = new ExtractMillisecond(sValue).invoke();
        } else if (sValue.endsWith("s")) {
            millis = new ExtractInSecond(sValue).invoke();
        } else if (sValue.endsWith("m")) {
            millis = new ExtractInMinute(sValue).invoke();
        } else if (sValue.endsWith("H") || sValue.endsWith("h")) {
            millis = new ExtractHour(sValue).invoke();
        } else if (sValue.endsWith("d")) {
            millis = new ExtractDay(sValue).invoke();
        } else if (sValue.endsWith("w")) {
            millis = new ExtractWeek(sValue).invoke();
        } else {
            millis = Long.parseLong(sValue);
        }
        return millis;
    } catch (NumberFormatException e) {
        LOGGER.warn("Number format exception", e);
    }
    return 0;
}
所有ExtractXXX方法都定义为static内部类。例如,如下所示-
    private static class ExtractHour {
      private String sValue;
      public ExtractHour(String sValue) {
         this.sValue = sValue;
      }
      public long invoke() {
         long millis;
         millis = (long) (Double.parseDouble(sValue.substring(0, sValue.length() - 1)) * 60 * 60 * 1000);
         return millis;
     }
 }
更新1
我将在这里提出一些建议,以使Sonar的人满意。绝对有改进和简化的空间。
番石榴Function在这里只是一个不需要的仪式。想要更新有关当前状态的问题。这里没有最后的决定。请倒下您的想法。
public class DurationParse {
private static final Logger LOGGER = LoggerFactory.getLogger(DurationParse.class);
private static final Map<String, Function<String, Long>> MULTIPLIERS;
private static final Pattern STRING_REGEX = Pattern.compile("^(\\d+)\\s*(\\w+)");
static {
    MULTIPLIERS = new HashMap<>(7);
    MULTIPLIERS.put("S", new Function<String, Long>() {
        @Nullable
        @Override
        public Long apply(@Nullable String input) {
            return new ExtractSecond(input).invoke();
        }
    });
    MULTIPLIERS.put("s", new Function<String, Long>() {
        @Nullable
        @Override
        public Long apply(@Nullable String input) {
            return new ExtractInSecond(input).invoke();
        }
    });
    MULTIPLIERS.put("ms", new Function<String, Long>() {
        @Nullable
        @Override
        public Long apply(@Nullable String input) {
            return new ExtractMillisecond(input).invoke();
        }
    });
    MULTIPLIERS.put("m", new Function<String, Long>() {
        @Nullable
        @Override
        public Long apply(@Nullable String input) {
            return new ExtractInMinute(input).invoke();
        }
    });
    MULTIPLIERS.put("H", new Function<String, Long>() {
        @Nullable
        @Override
        public Long apply(@Nullable String input) {
            return new ExtractHour(input).invoke();
        }
    });
    MULTIPLIERS.put("d", new Function<String, Long>() {
        @Nullable
        @Override
        public Long apply(@Nullable String input) {
            return new ExtractDay(input).invoke();
        }
    });
    MULTIPLIERS.put("w", new Function<String, Long>() {
        @Nullable
        @Override
        public Long apply(@Nullable String input) {
            return new ExtractWeek(input).invoke();
        }
    });
}
public static long parseTimeValue(String sValue) {
    if (isNullOrEmpty(sValue)) {
        return 0;
    }
    Matcher matcher = STRING_REGEX.matcher(sValue.trim());
    if (!matcher.matches()) {
        LOGGER.warn(String.format("%s is invalid duration, assuming 0ms", sValue));
        return 0;
    }
    if (MULTIPLIERS.get(matcher.group(2)) == null) {
        LOGGER.warn(String.format("%s is invalid configuration, assuming 0ms", sValue));
        return 0;
    }
    return MULTIPLIERS.get(matcher.group(2)).apply(matcher.group(1));
}
private static class ExtractSecond {
    private String sValue;
    public ExtractSecond(String sValue) {
        this.sValue = sValue;
    }
    public long invoke() {
        long millis;
        millis = Long.parseLong(sValue);
        return millis;
    }
}
private static class ExtractMillisecond {
    private String sValue;
    public ExtractMillisecond(String sValue) {
        this.sValue = sValue;
    }
    public long invoke() {
        long millis;
        millis = (long) (Double.parseDouble(sValue));
        return millis;
    }
}
private static class ExtractInSecond {
    private String sValue;
    public ExtractInSecond(String sValue) {
        this.sValue = sValue;
    }
    public long invoke() {
        long millis;
        millis = (long) (Double.parseDouble(sValue) * 1000);
        return millis;
    }
}
private static class ExtractInMinute {
    private String sValue;
    public ExtractInMinute(String sValue) {
        this.sValue = sValue;
    }
    public long invoke() {
        long millis;
        millis = (long) (Double.parseDouble(sValue) * 60 * 1000);
        return millis;
    }
}
private static class ExtractHour {
    private String sValue;
    public ExtractHour(String sValue) {
        this.sValue = sValue;
    }
    public long invoke() {
        long millis;
        millis = (long) (Double.parseDouble(sValue) * 60 * 60 * 1000);
        return millis;
    }
}
private static class ExtractDay {
    private String sValue;
    public ExtractDay(String sValue) {
        this.sValue = sValue;
    }
    public long invoke() {
        long millis;
        millis = (long) (Double.parseDouble(sValue) * 24 * 60 * 60 * 1000);
        return millis;
    }
}
private static class ExtractWeek {
    private String sValue;
    public ExtractWeek(String sValue) {
        this.sValue = sValue;
    }
    public long invoke() {
        long millis;
        millis = (long) (Double.parseDouble(sValue) * 7 * 24 * 60 * 60 * 1000);
        return millis;
    }
}
}
更新2
尽管我添加了更新,但值得花很多时间。我将继续前进,因为Sonar现在没有抱怨。不用担心,我接受mattnz的答案,因为这是必经之路,并且不想为碰到这个问题的人树立榜样。底线-不要为了Sonar(或Half Baked项目经理)而抱怨工程师。只要做一个值得一分钱的项目。谢谢大家。
ExtractBlah定义类?这些是来自图书馆还是自制的?
                
private static Dictionary<string,Func<string,long>> _mappingStringToParser;我将把剩下的作为练习留给您(或现在比我有更多空闲时间的人)。还有一个更简洁的API,如果你有一元解析器任何熟悉被发现,但现在我不会去那里..