Нелегальная прямая ссылка и перечисления - PullRequest
57 голосов
/ 15 апреля 2011

Я программирую игру на 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;
   }
}

Есть ли способ обойти эту проблему, используя перечисления, которые так же просто

Ответы [ 11 ]

0 голосов
/ 18 августа 2016

Я предпочел это:

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

   private Link link;

   private Link getLink() {
     if (link == null) {
        link = Link.valueOf(name());
     }
     return link;
   }

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

public enum Link {
   TOP(Edge.BOTTOM),
   BOTTOM(Edge.TOP),
   LEFT(Edge.RIGHT),
   RIGHT(Edge.LEFT);

   private Edge opposite;

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

   public Edge opposite() {
      return this.opposite;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...