安卓 Java枚举提供了不正确的值
我最近开始使用java,经过长时间使用C、C++和C语言。我无法理解Java枚举应该如何工作。 经过一些研究,我创建了以下内容:
public class RedRoad implements Serializable, Parcelable
{
// ... other parts removed for clarity
public enum State
{
NOT_STARTED(0),
PART_DONE(1),
COMPLETED(2);
private int value;
private State(int value) {
this.value = value;
}
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
}
我使用getValue()将这些状态值存储在sqlite数据库中作为int,使用setValue()检索它们,然后通过广播发送结果“Road”对象。那么我就这样做:
switch (road.state) {
case COMPLETED:
pline.getOutlinePaint().setColor(Color.GREEN); break;
case PART_DONE:
pline.getOutlinePaint().setColor(Color.argb(0xFF,0xFF,0xA5,0x00)); break;
case NOT_STARTED:
default: pline.getOutlinePaint().setColor(Color.RED);
}
但前两个案例从未被调用,即使我已经检查过那条路。状态getValue()有时是1,而不是零。 此外,如果我将开关代码更改为:
switch (road.state.getValue()) {
case 2:
pline.getOutlinePaint().setColor(Color.GREEN); break;
case 1:
Log.d("*** road state ", String.valueOf(road.state.getValue()));
Log.e("*** road state ", String.valueOf(road.state));
pline.getOutlinePaint().setColor(Color.argb(0xFF,0xFF,0xA5,0x00));
break;
case 0:
default:
pline.getOutlinePaint().setColor(Color.RED);
}
然后根据要求设置颜色。我在日志中得到了一个特别的结果:
D/*** road state: 1
E/*** road state: NOT_STARTED
这怎么可能未启动定义为零
[编辑] 后来发现,除了上面提到的(我可以找到解决方法)之外,从异步任务发送到主活动后,值是不正确的(“Road”类是parcelable)。如果我记录状态。getValue()在发送之前,然后在接收之后,所有非零值都已更改为零
# 1 楼答案
您正在第二个实例中对枚举常量调用
String.valueOf
,该实例调用枚举的toString
方法。枚举的默认toString
实现返回name
字段,使NOT_STARTED
成为有效的返回值枚举本质上是具有有限数量实现的抽象类,每个实现保证每个JVM只存在一次
# 2 楼答案
@AndyTurner不使用setter是正确的。我现在已经在一个专门创建的新应用程序中做了更多的测试,setter给出了完全不可预测的结果。 因此,我使用的解决方案(用于从db中的“int”设置值)有点无聊
虽然这是可行的,但在我看来,这在一定程度上挫败了使用Enum(而不是int)作为起点的原因。 而且,由于创建setter(我最初使用的)会给出不正确的结果,我想知道为什么androidstudio(4.1)没有对此给出警告?我很高兴就这么多其他(不太重要的)事情向我提出警告