我必須寫很多條件,但 SonarLint 給了我錯誤,要求重構方法以降低其認知復雜性。
如何解決這個問題。我試過switch-case,但這也給出了同樣的錯誤。
public enum ExampleEnum {
UNKNOWN(-1),
D0_D100(0),
D100_D200(100),
D200_D300(200),
D300_D400(300),
D400_D500(400),
D500_D600(500),
D600_D700(600),
D700_D800(700),
D800_D900(800),
D900_D1000(900);
private int score;
ExampleEnum(int score) {
this.score = score;
}
}
public static ExampleEnum getScoreType(Integer score) {
if (Objects.isNull(score) || score < D0_D100.score) {
return UNKNOWN;
} else if (score >= D0_D100.score && score < D100_D200.score) {
return D0_D100;
} else if (score >= D100_D200.score && score < D200_D300.score) {
return D100_D200;
} else if (score >= D200_D300.score && score < D300_D400.score) {
return D200_D300;
} else if (score >= D300_D400.score && score < D400_D500.score) {
return D300_D400;
} else if (score >= D400_D500.score && score < D500_D600.score) {
return D400_D500;
} else if (score >= D500_D600.score && score < D600_D700.score) {
return D500_D600;
} else if (score >= D600_D700.score && score < D700_D800.score) {
return D600_D700;
} else if (score >= D700_D800.score && score < D800_D900.score) {
return D700_D800;
} else if (score >= D800_D900.score && score < D900_D1000.score) {
return D800_D900;
} else {
return D900_D1000;
}
}
uj5u.com熱心網友回復:
將邏輯放入回圈中。就像是:
public static ExampleEnum getScoreType(Integer score) {
if (Objects.isNull(score) || score < D0_D100.score) {
return UNKNOWN;
for (int i =0; i< ExampleEnum.values().length-1;i ) {
if (ExampleEnum.values()[i].score <= score && ExampleEnum.values()[i 1].score > score )
return ExampleEnum.values()[i];
}
return D900_D1000;
}
uj5u.com熱心網友回復:
您可以使用 Stream API 來消除這種冗余。
為此,您利用了列舉成員的自然順序反映了相應的順序這一事實。score
values()作為流的源,您可以使用呼叫回傳的陣列或EnumSet通過EnumSet.allOf().
在遍歷列舉成員時,我們需要找到第一個score等于或小于給定分數的常數。因為列舉score的屬性表示范圍的下限,所以只有一個條件就足以確定給定分數是否落入與特定enum-member對應的范圍內。
這個邏輯可以用運算filter() 的組合來表達findFirst():
public static ExampleEnum getScoreType(Integer score) {
if (score == null || score < ExampleEnum.D0_D100.score) {
return ExampleEnum.UNKNOWN;
}
return EnumSet.allOf(ExampleEnum.class).stream()
.filter(e -> score >= e.score)
.findFirst()
.orElse(ExampleEnum.D900_D1000);
}
注意:您沒有檢查給定分數是否超過最大范圍,在這種情況下,將回傳最后一個列舉常量。但由于它的名稱D900_D1000表示它代表有限范圍的值,您可能需要添加此檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/517979.html
