非法转发参考和枚举

Mat*_*eck 58 java enums

我正在编写一个java游戏,它由一块瓷砖组成.我不能直观地定义瓷砖的边缘以及它们如何相互关联,例如为了获得瓷砖的相对边缘,我希望能够只输入TOP.opposite().但是,当使用枚举来定义这些边时,我最终必须在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;
   }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用枚举来解决这个问题,这很简单?

Pet*_*rey 74

你可以这样做,这不是那么直观.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 16

enum Edge {
    TOP {
        @Override
        public Edge opposite() {
            return BOTTOM;
        }
    },
    BOTTOM {
        @Override
        public Edge opposite() {
            return TOP;
        }
    },
    LEFT {
        @Override
        public Edge opposite() {
            return RIGHT;
        }
    },
    RIGHT {
        @Override
        public Edge opposite() {
            return LEFT;
        }
    };

    public abstract Edge opposite();
}
Run Code Online (Sandbox Code Playgroud)


eye*_*ash 12

public enum Edge {

    TOP,
    BOTTOM(Edge.TOP),
    LEFT,
    RIGHT(Edge.LEFT);

    private Edge opposite;

    private Edge() {

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

    public Edge opposite() {
        return this.opposite;
    }
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*usC 6

这是另一种方式

public enum Edge {

    TOP("BOTTOM"),
    BOTTOM("TOP"),
    LEFT("RIGHT"),
    RIGHT("LEFT");

    private String opposite;

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

    public Edge opposite(){
        return valueOf(opposite);
    }

}
Run Code Online (Sandbox Code Playgroud)

然而,Peter Lawrey的解决方案更有效,编译时更安全.


jac*_*des 6

您还可以在枚举中使用静态内部类:

public enum EnumTest     
{     
NORTH( Orientation.VERTICAL ),     
SOUTH( Orientation.VERTICAL ),     
EAST( Orientation.HORIZONTAL ),     
WEST( Orientation.HORIZONTAL );     

private static class Orientation  
{  
private static final String VERTICAL = null;     
private static final String HORIZONTAL = null;     
}
}
Run Code Online (Sandbox Code Playgroud)

这里来的 :)


Jef*_*ter 5

你可以定义一个类似于下面的方法。

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

    public Edge opposite() {
        switch (this) {
            case TOP:
                return Edge.BOTTOM;
            case BOTTOM:
                return Edge.TOP;
            case LEFT:
                return RIGHT;
            case RIGHT:
                return LEFT;
            default:
                throw new RuntimeException("Oh dear");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)