MattLBeck MattLBeck - 3 months ago 7
Java Question

Illegal Forward Reference and Enums

I'm programming a game in java which is made up of a grid of tiles. I wan't to be able to inuitively define the edges of the tiles and how they relate to each other, e.g. to get the opposite edge of a tile, I want to be able to just type

TOP.opposite()
. However, when using enums to define these edges I end up having to forward reference at least two of them in the contstructor:

public enum Edge {

TOP(Edge.BOTTOM), //illegal forward reference
BOTTOM(Edge.TOP),
LEFT(Edge.RIGHT), //illegal forward reference
RIGHT(Edge.LEFT);

private Edge opposite;

private Edge(Edge opp){
this.opposite = opp;
}

public Edge opposite(){
return this.opposite;
}
}


Is there any way of getting round this problem using enums which is just as simple?

Answer

You can do this which is not as intuitive.

public enum Edge {
    TOP, BOTTOM, LEFT, RIGHT;
    private Edge opposite;

    static {
        TOP.opposite = BOTTOM;
        BOTTOM.opposite = TOP;
        LEFT.opposite = RIGHT;
        RIGHT.opposite = LEFT;
    }
    public Edge opposite(){
        return this.opposite;
    }
}