我正在解决SonarQube问题,在那个问题中我面临一个波纹错误,但不能理解这是什么类型的错误,
这是我的实体类
@Entity
@Cacheable
@DynamicUpdate
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = Vendor.TABLE_NAME)
public class Vendor
{
@Column(name = VENDOR_MODIFIED_BY_FOREIGN_KEY, nullable = true)
private Integer modifiedBy;
public Integer getModifiedBy() {
return modifiedBy == null ? 0 : modifiedBy;
//Boxed value is unboxed and then immediately reboxed in com.bostonbyte.thelift.entities.vendors.Vendor.getModifiedBy()
}
public void setModifiedBy(Integer modifiedBy) {
this.modifiedBy = modifiedBy;
}
我在
收到错误 public Integer getModifiedBy() {
return modifiedBy == null ? 0 : modifiedBy;
请您告诉我这是什么类型的错误?
答案 0 :(得分:2)
这意味着,modifiedBy
将被取消装箱,将其与primitivv类型进行比较而不是装箱,因为返回值是一个objext。
使用:
return modifiedBy == null ? Integer.valueOf(0) : modifiedBy;
并且错误应该消失。
答案 1 :(得分:1)
嗯,modifiedBy
是Integer
,但三元条件表达式modifiedBy == null ? 0 : modifiedBy
的类型是int
(这是第二个操作数为时的条件表达式的类型int
和第3个操作数是Integer
,as you can see in table 15.25-C. of the JLS)。
因此modifiedBy
已取消装箱int
以评估该表达式。
然后再将它装箱到Integer
,因为这是getModifiedBy()
方法的返回类型。
您可以将该方法的返回类型更改为int
以避免装箱
(似乎有道理,因为getModifiedBy()
永远不会返回null
):
public int getModifiedBy() {
return modifiedBy == null ? 0 : modifiedBy;
}
答案 2 :(得分:1)
这意味着,将原始数据类型自动转换为等效的Wrapper类型称为装箱,而对向操作称为拆箱。
在你的代码modifiedby
得到unboxed,用于与int值(0)比较,即原始数据类型,在值得到比较后,它将再次装箱,因为它的返回类型是Wrapper类,我想你应该去@jens的第一个答案。
答案 3 :(得分:0)
与布尔相同的问题。
return isModified == null? false : defValue
更改为:
return isModified == null? Boolean.valueOf(false) : defValue