Java 可折叠语句
我最近使用PMD(嵌入hudson中)遇到了以下警告,我的代码似乎受到了可折叠IFStatements的影响,我不完全理解。代码如下所示Java 可折叠语句,java,pmd,statements,Java,Pmd,Statements,我最近使用PMD(嵌入hudson中)遇到了以下警告,我的代码似乎受到了可折叠IFStatements的影响,我不完全理解。代码如下所示 // list to be filled with unique Somethingness List list = new ArrayList(); // fill list for (SomeObject obj : getSomeObjects()) { // interating if (!obj.getSomething().isEmpty(
// list to be filled with unique Somethingness
List list = new ArrayList();
// fill list
for (SomeObject obj : getSomeObjects()) { // interating
if (!obj.getSomething().isEmpty()) { // check if "Something" is empty *
if (!list.contains(obj.getSomething())) { // check if "Something" is already in my list **
list.add(obj.getSomething()); // add "Something" to my list
}
}
}
在我看来,这段代码并不是更“可折叠”(否则,下一个阅读代码的人将更不可读)。另一方面,我希望解决此警告(不停用PMD;)。我认为这就是PMD想要的:
if (!obj.getSomething().isEmpty() && !list.contains(obj.getSomething())) {
list.add(obj.getSomething());
}
以下是一些改进建议(以及防止PMD尖叫):
final Something sth = obj.getSomething();
if (!sth.isEmpty() && !list.contains(sth)) {
list.add(sth);
}
某物中提取方法(更多OOD):
if (!obj.getSomething().isEmpty() && !list.contains(obj.getSomething())) {
list.add(obj.getSomething());
}
嗯,这个检查有时很有用,但在其他一些情况下应该忽略。关键是让代码尽可能可读。如果您觉得您的代码比折叠的If语句更可读,那么添加一个
@SuppressWarnings(“PMD.collapsableifstatements”)
注释。一种可能性是排除重复的obj.getSomething()
然后折叠嵌套的If
语句:
for (SomeObject obj : getSomeObjects()) {
Something smth = obj.getSomething();
if (!smth.isEmpty() && !list.contains(smth)) {
list.add(smth);
}
}
在我看来,结果是相当可读的,应该不再触发PMD警告
另一种方法是将
列表
替换为集合
,并避免显式的包含()
检查。使用集合
也会有更好的计算复杂度。嗨,托马斯,谢谢你的回答,我真的很喜欢这种方法#2。
if (!obj.getSomething().isEmpty() && !list.contains(obj.getSomething())) {
list.add(obj.getSomething());
}
for (SomeObject obj : getSomeObjects()) {
Something smth = obj.getSomething();
if (!smth.isEmpty() && !list.contains(smth)) {
list.add(smth);
}
}