盒装值未装箱,然后立即重新装箱

时间:2017-07-21 08:34:35

标签: java spring-mvc

我正在解决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;

请您告诉我这是什么类型的错误?

4 个答案:

答案 0 :(得分:2)

这意味着,modifiedBy将被取消装箱,将其与primitivv类型进行比较而不是装箱,因为返回值是一个objext。

使用:

return modifiedBy == null ? Integer.valueOf(0) : modifiedBy;

并且错误应该消失。

答案 1 :(得分:1)

嗯,modifiedByInteger,但三元条件表达式modifiedBy == null ? 0 : modifiedBy的类型是int(这是第二个操作数为时的条件表达式的类型int和第3个操作数是Integeras 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