有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 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()在发送之前,然后在接收之后,所有非零值都已更改为零


共 (2) 个答案

  1. # 1 楼答案

    您正在第二个实例中对枚举常量调用String.valueOf,该实例调用枚举的toString方法。枚举的默认toString实现返回name字段,使NOT_STARTED成为有效的返回值

    枚举本质上是具有有限数量实现的抽象类,每个实现保证每个JVM只存在一次

  2. # 2 楼答案

    @AndyTurner不使用setter是正确的。我现在已经在一个专门创建的新应用程序中做了更多的测试,setter给出了完全不可预测的结果。 因此,我使用的解决方案(用于从db中的“int”设置值)有点无聊

    protected void setState(int i) {
        switch (i)
        {
            case 2:     state = State.COMPLETED;     break;
            case 1:     state = State.PART_DONE;     break;
            default:    state = State.NOT_STARTED;
        }
    }
    

    虽然这是可行的,但在我看来,这在一定程度上挫败了使用Enum(而不是int)作为起点的原因。 而且,由于创建setter(我最初使用的)会给出不正确的结果,我想知道为什么androidstudio(4.1)没有对此给出警告?我很高兴就这么多其他(不太重要的)事情向我提出警告