title: How can I associate an Enum with its opposite value, as in cardinal directions (North - South, East - West, etc)?
body: <p>I'm still working on my Cell class for my maze game I'm attempting to make.  After help in a different thread it was suggested that I use an EnumMap for my Walls/Neighbors and this is working great so far.</p>
  
  <p>Here is what I have thus far:</p>
  
  <pre><code>enum Dir {
      NORTH, SOUTH, EAST, WEST
  }
  
  class Cell {
      public Map&lt;Dir, Cell&gt; neighbors = Collections
              .synchronizedMap(new EnumMap&lt;Dir, Cell&gt;(Dir.class));
      public Map&lt;Dir, Boolean&gt; walls = Collections
              .synchronizedMap(new EnumMap&lt;Dir, Boolean&gt;(Dir.class));
  
      public boolean Visited;
  
      public Cell() {
          Visited = false;
          for (Dir direction : Dir.values()) {
              walls.put(direction, true);
          }
      }
  
      // Randomly select an unvisited neighbor and tear down the walls
      // between this cell and that neighbor.
      public Cell removeRandomWall() {
          List&lt;Dir&gt; unvisitedDirections = new ArrayList&lt;Dir&gt;();
          for (Dir direction : neighbors.keySet()) {
              if (!neighbors.get(direction).Visited)
                  unvisitedDirections.add(direction);
          }
  
          Random randGen = new Random();
          Dir randDir = unvisitedDirections.get(randGen
                  .nextInt(unvisitedDirections.size()));
          Cell randomNeighbor = neighbors.get(randDir);
  
          // Tear down wall in this cell
          walls.put(randDir, false);
          // Tear down opposite wall in neighbor cell
          randomNeighbor.walls.put(randDir, false); // &lt;--- instead of randDir, it needs to be it's opposite.
  
          return randomNeighbor;
      }
  }
  </code></pre>
  
  <p>If you look at that last comment there, I first tear down say the NORTH wall in my current cell.  I then take my North neighbor, and now I must tear down my SOUTH wall, so the walls between the two cells have been removed.</p>
  
  <p>What would be a simple way to extend my enum so I can give it a direction and it return to me it's opposite?</p>