Nice question. Perhaps you will like this solution:
public class Test {
public enum Flippable {
A, B, Y, Z;
private Flippable opposite;
static {
final Flippable[] a = Flippable.values();
final int n = a.length;
for (int i = 0; i < n; i++)
a[i].opposite = a[n - i - 1];
}
public Flippable flip() {
return opposite;
}
}
public static void main(final String[] args) {
for (final Flippable f: Flippable.values()) {
System.out.println(f + " opposite: " + f.flip());
}
}
}
Result:
$ javac Test.java && java Test
A opposite: Z
B opposite: Y
Y opposite: B
Z opposite: A
$
If you want to keep the instance field "final" (which is certainly nice), you could index into the array at runtime:
public class Test {
public enum Flippable {
A(3), B(2), Y(1), Z(0);
private final int opposite;
private Flippable(final int opposite) {
this.opposite = opposite;
}
public Flippable flip() {
return values()[opposite];
}
}
public static void main(final String[] args) {
for (final Flippable f: Flippable.values()) {
System.out.println(f + " opposite: " + f.flip());
}
}
}
which also works.