I would like to have enumerator in Java having other enum as attribute.
public enum Direction {
Up(Down),
Down(Up),
Left(Right),
Right(Left);
private Direction opposite;
Direction(Direction opposite){
this.opposite = opposite;
}
}
So I have different Direction, and for each I want to know the opposite. It is working fine for Down and Right, but I can't initialize Up because Down is not known yet (same fort Left).
How can I edit enum variables after initialisation ?
4 Answers 4
Put your initialization in a static block:
public enum Direction {
Up, Down, Left, Right;
private Direction opposite;
static {
Up.setDirection(Down);
Down.setDirection(Up);
Left.setDirection(Right);
Right.setDirection(Left);
}
private void setDirection(Direction opposite) {
this.opposite = opposite;
}
public String toString() {
return this.name() + " (" + opposite.name() + ")";
}
}
1 Comment
One of the possible solution - you can encapsulate this login within the method
public Direction getOpposite() {
switch (this) {
case Up:
return Down;
case Down:
return Up;
case Left:
return Right;
case Right:
return Left;
}
return null;
}
It will be the same interface for classes that will use this enum
Comments
Quick and dirty solution, put the initialization in a static block:
public enum Direction {
Up,
Down,
Left,
Right;
private Direction opposite;
public Direction opposite() {
return this.opposite;
}
static {
Up.opposite = Down;
Down.opposite = Up;
Left.opposite = Right;
Right.opposite = Left;
}
}
Comments
One trick is to leave the arguments as nulls:
enum Direction {
Up(null),
Down(Up),
Left(null),
Right(Left);
and set the "opposite of the opposite" to this in the constructor:
Direction(Direction opposite){
this.opposite = opposite;
if (opposite != null) {
opposite.opposite = this;
}
}
But this is merely a trick. I don't think it's good-looking code.