Srinivasan
Srinivasan

Reputation: 12040

A boxed value is unboxed and then immediately reboxed

I am getting the Findugs error "A boxed value is unboxed and then immediately reboxed".

This is the Code:

Employee emp = new Employee()
Long lmt = 123L;

emp.setLimit(Long.valueOf(lmt)); 

In this, Employee limit field is of type Long. Could you please let me know what is the error?

Upvotes: 11

Views: 21961

Answers (3)

Peter Butkovic
Peter Butkovic

Reputation: 12179

The problem is that you're converting Long -> long -> Long.

So in the background:

  1. Long.valueOf(lmt) converts Long to long
  2. emp.setLimit(<long>); converts long to Long again

As of Java 5 autoboxing happens => your code should look like this:

Employee emp = new Employee()
Long lmt = 123L;

emp.setLimit(lmt); 

or even:

Employee emp = new Employee()
long lmt = 123L;

emp.setLimit(lmt); 

Upvotes: 22

Andreas Dolk
Andreas Dolk

Reputation: 114797

emp.setLimit(Long.valueOf(lmt));

Long.valueOf takes a long value, but you pass a Long value -- mandating unboxing. Immediately afterward, however, Long.valueOf re-boxes the value and the expression evaluates to a Long again. FindBugs detects the unnecessary conversion chain Long -> long -> Long.

Upvotes: 1

jpkroehling
jpkroehling

Reputation: 14061

That happens because Long.valueOf(long) will unbox your lmt from Long to long, just to get a Long again. As you said that limit is a Long, you don't need to use Long.valueOf, just use the var:

emp.setLimit(lmt); 

Upvotes: 4

Related Questions