Re: final field of an enum to refer to later-named instance.
Andreas Leitgeb wrote:
[This is a supercede, just to correct a broken Subject]
I've got an enum that contains Things that come in pairs.
I'd like each Thing to have a *final* reference to
it's mate, that in half of the cases appears later
in the list of Thing-instances.
e.g.:
enum Thing {
T1, T2;
final Thing mate;
}
What could I do, to make T2 "final"ly the mate of T1
and vice versa ?
I know some alternatives, myself, like just making the
reference non-final (and initialize it in the enum's
static {...} block) or defining an abstract method in
the enum like "abstract Thing getMate();" and implement
it for each instance to return its mate...
Please only followup, if you know a trick for final fields,
or if you know that it is strictly impossible that way.
Not having played with enums, I don't know what games you can play with
their constructors, but this kind of thing will work for a "normal" class.
(The trick is to construct the mate if and only if it doesn't already
exist.)
import java.util.Map;
import java.util.HashMap;
public class Mates
{
public final Mates myMate;
private final int value;
private static Map<Integer, Mates> instances = new HashMap<Integer,
Mates>();
public Mates(int i)
{
value = i;
instances.put(i, this);
int mateValue = (i % 2 == 0) ? i + 1 : i - 1;
if (instances.get(mateValue) == null)
new Mates(mateValue);
myMate = instances.get(mateValue);
}
public String toString()
{
return Integer.valueOf(value).toString();
}
public static void main(String[] args)
{
Mates[] arr = new Mates[10];
for (int i = 0; i < 10; i++)
arr[i] = new Mates(i);
for (int i = 0; i < 10; i++)
{
System.out.println(arr[i] + " is the mate of " + arr[i].myMate);
}
}
}