Java SonarQube警告:使用等于代替==:相关?

Java SonarQube警告:使用等于代替==:相关?,java,sonarqube,equals,Java,Sonarqube,Equals,SonarQube规则在我的开发项目中是强制执行的,我不确定规则“S1698”([MAJOR]更改此比较以使用equals方法)是否与我的几个案例相关(我仍然需要为这些警告做一些事情)。你明白为什么我的代码/算法会很有用,为什么应该通过实现equals或重新访问algo来缓解它吗 第一个简单案例 我有一组(稍微复杂的)对象。我需要找到最相关的,并显示在一个组合框中(最相关的被选中)。伪代码: List<MyObject> list = ...; MyObject bestMatch

SonarQube规则在我的开发项目中是强制执行的,我不确定规则“S1698”([MAJOR]更改此比较以使用equals方法)是否与我的几个案例相关(我仍然需要为这些警告做一些事情)。你明白为什么我的代码/算法会很有用,为什么应该通过实现equals或重新访问algo来缓解它吗

第一个简单案例

我有一组(稍微复杂的)对象。我需要找到最相关的,并显示在一个组合框中(最相关的被选中)。伪代码:

List<MyObject> list = ...;
MyObject bestMatch = findBestMatch(list);
for(obj : list) {
  addToCombo(obj, obj == bestMatch /* isSelected */);
}
boolean isNameInConflict(MyObject testedObject) {
 List<MyObject> list = nameIndex.get(testedObject.getName());
 for(obj : list) {
  if (obj != testedObject && !obj.isDisabled()) { return true; }
 }
 return false;
}
List=。。。;
MyObject bestMatch=findBestMatch(列表);
用于(对象:列表){
addToCombo(obj,obj==bestMatch/*isSelected*/);
}
我可以使用“obj.equals(bestMatch)”(我不需要实现),它反过来会调用==,但是如果有一天有人实现了“equals”,我的代码可能会调用一个不需要的深度比较

其他情况

我有一个对象图,这些对象从未被复制过,由它们的实例定义,并且通过完整值进行比较实际上并不相关。在我的图形中,我可以有两个具有相同内容的对象,但我需要它们是不同的对象(用户必须编辑它们,直到它们的值变得不同)

我需要以几种方式对它们进行索引(例如:按名称,这可能不是唯一的),以发出快速请求,例如“图中是否有其他具有相同名称且未禁用的对象”。我已经编写了类似以下伪代码的搜索方法:

List<MyObject> list = ...;
MyObject bestMatch = findBestMatch(list);
for(obj : list) {
  addToCombo(obj, obj == bestMatch /* isSelected */);
}
boolean isNameInConflict(MyObject testedObject) {
 List<MyObject> list = nameIndex.get(testedObject.getName());
 for(obj : list) {
  if (obj != testedObject && !obj.isDisabled()) { return true; }
 }
 return false;
}
boolean isnameinflict(MyObject testedObject){
List=nameIndex.get(testedObject.getName());
用于(对象:列表){
if(obj!=testedObject&!obj.isDisabled()){return true;}
}
返回false;
}
}


再一次,我可以调用equals(我不需要实现),但我觉得它可以让维护人员认为我实现了它。或者,我可以为每个对象生成一个唯一的自动递增ID(我的对象只存在于一个定义良好的范围内,从不保存或传输)。

在我看来,警告只是一个提示,需要仔细查看相关代码。如果你发现它现在还可以,那就好了。另一方面,一个好的equals方法应该首先检查引用的相等性,所以调用equals根本不应该是一个性能问题。我应该写下严格执行“临界”和“主要”警告,而且会监控“@SuppressWarning”的使用。@jbnize别傻了,我想你回答了我的问题。使用默认的“equals”看起来是正确的解决方案。@JBNizet如果两个对象不同(大多数情况下可能是这种情况),则将执行更昂贵的检查。虽然这种开销可以忽略不计,但我的观点是,修复误报警告根本无助于提高质量。在我看来,警告只是一个提示,让我们更仔细地看一看正在讨论的代码。如果你发现它现在还可以,那就好了。另一方面,一个好的equals方法应该首先检查引用的相等性,所以调用equals根本不应该是一个性能问题。我应该写下严格执行“临界”和“主要”警告,而且会监控“@SuppressWarning”的使用。@jbnize别傻了,我想你回答了我的问题。使用默认的“equals”看起来是正确的解决方案。@JBNizet如果两个对象不同(大多数情况下可能是这种情况),则将执行更昂贵的检查。虽然这种开销可以忽略不计,但我的观点是,修复误报警告根本无助于提高质量。它只会导致无用的工作。