我无法在课堂上设置枚举值

时间:2015-06-28 19:25:13

标签: java android enums

当我尝试以这种方式将enum变量作为参数传递给类时:

MyClass newObjectMyClass = new MyClass(EnumArgument.AAA);

然后我尝试将此参数值设置为新变量或将其传递给下一个类:

public class MyClass {
    EnumArgument xarg;

    public MyClass(EnumArgument qarg) {
        xarg = qarg;
    }

    EnumArgument new = xarg;

    NextClass nextClassObject = new NextClassObject(xarg);

    public void move(Canvas can) {
        Log.i("info", "xarg = " + xarg + "   nextClassObject.doSomething = " + nextClassObject.doSomething + " new = " + new);
        nextClassObject.doSomething(can);
    }
}

Logcat向我展示了类似的内容:

  

I / info :: xarg = AAA nextClassObject.doSomething = null new = null   threadid = 1:线程退出未捕获的异常

如你所见,logcat向我显示我的“xarg”值,但“new”变量为null ...“new”应该与xarg具有相同的值,我是对的吗?

(我只是写这段代码来告诉你我的意思,如果有任何错误,那可能就是我的错误。)

我认为存在一些逻辑错误。 当我把这一行:

NextClass nextClassObject = new NextClassObject(xarg);

我的move方法效果很好。

1 个答案:

答案 0 :(得分:1)

在Java中,初始值设定项在构造函数之前调用

因此,当您致电new Myclass(EnumArgument.AAA)时,会分配内存。首先,所有字段都获得默认值。所以就好像执行了这些指示一样:

xarg = null;
new = null;  // The name "new" is actually illegal
nextClassObject = null;

那是因为参考变量的默认值是null

下一步是计算和分配初始化器。你有两个初始化器:

EnumArgument new = xarg;
NextClass nextClassObject = new NextClassObject(xarg);

因此,您将xarg的值指定给new。但是从上一阶段开始,xargnull,因此new现在也是nullnextClassObject收到一个新的非null对象引用 - 但NextClassObject的构造函数的参数是null

然后调用构造函数

public MyClass(EnumArgument qarg) {
    xarg = qarg;
}

所以现在你把你的论点的价值 - EnumArgument.AAA - 放在xarg中。因此,xarg的值为AAA,但new的值为 null ,因为它是在前一阶段设置的,之前是构造函数将值赋给xarg

如果希望new包含参数中的值,则不应该使用初始化程序对其进行初始化,而是在构造函数中为其赋值:

public MyClass(EnumArgument qarg) {
    xarg = qarg;
    new = xarg;
}

如果在构造函数和方法之前严格保留所有字段声明会更好。这样你就不会对执行的顺序感到困惑。