在foreach循环中调用Java枚举构造函数

时间:2014-05-06 15:42:35

标签: java enums

有人可以帮我理解为什么输出以下代码,在java中:

public class Main {

    public static int position1, position2;

    private enum Direction{
        North(1,1),
        South(-1,-1),
        West(-1,0),
        East(1,0);

        Direction(int i, int j){
            position1=i;
            position2=j;
        }
    }

    public static void main(String[] args){       

        for(Direction d: Direction.values()){
            System.out.println(d + " has coordinates (" + position1 + "," + position2 + ")");
        }

    }  
}

输出结果为:

North has coordinates (1,0)
South has coordinates (1,0)
West has coordinates (1,0)
East has coordinates (1,0)

这就是,始终使用元素East的参数调用构造函数。为什么会这样?我似乎无法在任何地方找到这个解释。

3 个答案:

答案 0 :(得分:2)

position1position2staticMain类。这意味着他们在全球范围内只为使用Main的任何人提供了每个字段的一个版本。你想要的是 Direction 上的实例字段。 Java tutorial on member fields还有更多信息。

private enum Direction {
    public int position1, position2;
    ...
}

您需要删除static关键字,以便每个Direction都有自己的position1position2值。您可能还希望将它们标记为final,这意味着它们只能设置一次(这是一个很好的通用做法,出于各种原因:更容易推理状态,捕获像这样的错误意外覆盖值,使线程安全的代码等。)

当您访问它们时,您需要指定要获取该位置的实例:

d.position1

(而不只是position1

发生这种情况的原因是,当您第一次使用Direction枚举时,JVM会加载其四个值中的每一个。为此,每个值都运行其构造函数。例如,当它加载North时,它会运行North(1, 1),并设置position1 = 1; position2 = 1。然后,当它加载South时,它会运行South(-1, -1),然后设置position1 = -1; position2 = -1;。由于每个字段只有一个版本(static的作用),因此South构造函数只会覆盖North构造函数所写的值。最终结果是,您将获得最后运行的任何构造函数的position1position2值。由于枚举值按照它们在代码中出现的顺序加载,因此该构造函数是最后一个值的值:East

答案 1 :(得分:0)

是。当您的意图显然是 instance 字段时,您正在使用static字段。传递给构造函数的值全部覆盖了最后使用的值。

删除"静态"并将它们移到枚举中:

private enum Direction{
    North(1,1),
    South(-1,-1),
    West(-1,0),
    East(1,0);

    public int position1, position2;

    Direction(int i, int j){
        position1=i;
        position2=j;
    }
}

现在请参考枚举实例的字段:

public static void main(String[] args){       

    for(Direction d: Direction.values()){
        System.out.println(d + " has coordinates (" + d.position1 + "," + d.position2 + ")");
    }

}

我会创建字段final - 否则可以更改字段:

public final int position1, position2;

答案 2 :(得分:0)

static不是您唯一的问题,您的位置字段的位置也不正确。试试这个:

public class Main {
    private enum Direction{
        North(1,1),
        South(-1,-1),
        West(-1,0),
        East(1,0);

        public final int position1;
        public final int position2;

        Direction(int i, int j){
            position1=i;
            position2=j;
        }                        
    }

    public static void main(String[] args){       

        for(Direction d: Direction.values()){
            System.out.println(d + " has coordinates (" + d.position1 + "," + d.position2 + ")");
        }

    }  
}