Java枚举行为

Java枚举行为,java,enums,Java,Enums,我们有以下列举: public enum ComponentTypes { PDIFF(301), TDIFF(302), TADJ(303); private long componentTypeId; private ComponentTypes(long componentTypeId){ this.componentTypeId = componentTypeId; } public Long getId()

我们有以下列举:

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;
    }
}
在我们的一个测试设置中,我们会执行
c.setComponentTypeId(ComponentTypes.TADJ.getId())
,但是当在测试中调用
c.getComponentTypeId()
时,它会抛出
NullPointerException
,然而
c.setComponentTypeId(303L)
会按预期工作。使用枚举设置值时,我缺少什么

编辑

看来@Tom是直截了当地说出了长/长不一致性。既然
getId()
返回
long
而不是
long
,它就可以正常工作了

编辑


看起来我之前所说的是错误的自动装箱确实如预期那样在那里工作在我刷新系统jvm等之后没有问题-这对我来说没有任何意义

您说在测试中调用setComponentId,但是您没有包含此方法的源代码。你能粘贴这个,并展示如何在测试中创建“c”对象吗

Tom,如果他们使用的是支持自动装箱的最新java版本,那么long/long肯定无关紧要了吧?

你没有说“c”是什么类型,但我怀疑它的setter没有做你认为它是什么——NullPointerException表示自动拆箱出了问题。虽然当成员为
Long
时返回
Long
是一种代码气味,但枚举本身似乎没有问题


实际上,用enum的ID调用
c.setComponentTypeId()
是另一种代码味道。为什么不将枚举本身与
c.setComponentType()
一起使用呢?这样做几乎会丢失枚举的所有值。

在哪里初始化c?我怀疑这就是问题所在,您收到的NullPointerException实际上来自setComponentTypeId调用,而不是getter

使用您的枚举代码(无需修改),我运行了以下操作:

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

c.setComponentTypeId(303L);
System.out.println(c.getComponentTypeId());
我的输出:

303

303


但是,;如果c没有正确初始化,当您第一次尝试调用c.setComponentTypeId时,会出现NullPointerException。

Erm,您似乎显示的是错误的代码。其中是
[gs]etComponentTypeId的代码(请注意,在一种情况下,您使用的是
long
,而在另一种情况下使用的是
long
)@Tom
[gs]etComponentTypeId
是长路径上的pojo构造field@Tom谢谢你的提示,但我不知道如何给你评分,所以我把你的评论提高了+1。有人能解释一下为什么自动装箱失败了吗?有些东西告诉我这与c的外观有关。在这种情况下,我们特别想要
id
303,而不是常量
TADJ