tags:

views:

120

answers:

3

We have the following enumeration:

public enum ComponentTypes {

    PDIFF(301),
    TDIFF(302),
    TADJ(303);

    private long componentTypeId;

    private ComponentTypes(long componentTypeId){
        this.componentTypeId = componentTypeId;
    }

    public Long getId(){
        return this.componentTypeId;
    }
}

In one of our tests setup we do c.setComponentTypeId(ComponentTypes.TADJ.getId()) but when c.getComponentTypeId() is invoked in the test it throws NullPointerException, yet c.setComponentTypeId(303L) works as expected. What am I missing with use of the enum to set the value?

EDIT

Looks like @Tom was straight on with the long/Long inconsistency. Now that getId() returns long not Long it works as expected.

EDIT

Looks like what I said earlier was wrong autoboxing does work there as expected is no issue after I refreshed the system jvm etc -- which doesn't make any sense to me!

A: 

You say in the test you call setComponentId, but you have not included the source for this method. Can you paste this, and also show how the 'c' object in the test is created?

Tom, if they are using a version of recent java supporting autoboxing surely long/Long won't matter?

Alb
+1  A: 

You don't say what type "c" is, but I suspect its setter is not doing what you think it is -- the NullPointerException is an indication of auto-unboxing gone wrong. You enum itself doesn't appear to have an issue, although returning a Long when the member is long is a code smell.

Actually, calling c.setComponentTypeId() with the enum's ID is another code smell. Why aren't you using the enum itself, with c.setComponentType()? The way you're doing it pretty much loses you all the value of enums.

kdgregory
In this case we specifically want the `id` 303 not the constant `TADJ`.
non sequitor
A: 

Where are you initializing c? I suspect this is the issue and that the NullPointerException you're receiving is actually coming from the setComponentTypeId call not the getter.

Using your code for the enum (with no modifications) I ran the following:

ComponentTypes c = ComponentTypes.PDIFF;
c.setComponentTypeId(ComponentTypes.TADJ.getId());
System.out.println(c.getComponentTypeId());

c.setComponentTypeId(303L);
System.out.println(c.getComponentTypeId());

My Output:

303

303

However; If c is not initialized properly, you (obviously) get a NullPointerException when you attempt to call c.setComponentTypeId for the first time.

Randyaa