Closure puzzler or enum references considered harmful
February 7th, 2008SPOILER - don’t read this if you want to figure out the Neapolitan Ice Cream Puzzler by yourself!
Neal Gafter posted a Closure Puzzler that hasn’t too much to do with closures, but shows that Static initializers considered harmful is not limited to the old enum-pattern, but also applies to Java 5 enums. Here the Java 5 version of his code for those who don’t get the closures code or simply are too lazy:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Compare {
static <T, U> List<U> map(List<T> list, Transformer<T, U> transform) {
List<U> result = new ArrayList<U>(list.size());
for (T t : list) {
result.add(transform.invoke(t));
}
return result;
}
public static void main(String[] args) {
List<Color> colors = map(Arrays.asList(Flavor.values()), new Transformer<Flavor,Color>(){public Color invoke( Flavor f ){return f.color; }});
System.out.println(colors.equals(Arrays.asList(Color.values())));
List<Flavor> flavors = map(Arrays.asList(Color.values()), new Transformer<Color,Flavor>(){public Flavor invoke(Color c){return c.flavor;} });
System.out.println(flavors.equals(Arrays.asList(Flavor.values())));
}
}
interface Transformer<S, T> {
T invoke(S s);
}
enum Color {
BROWN(Flavor.CHOCOLATE), RED(Flavor.STRAWBERRY), WHITE(Flavor.VANILLA);
final Flavor flavor;
Color(Flavor flavor) {
this.flavor = flavor;
}
}
enum Flavor {
CHOCOLATE(Color.BROWN), STRAWBERRY(Color.RED), VANILLA(Color.WHITE);
final Color color;
Flavor(Color color) {
this.color = color;
}
}
I think I have already seen such a backport already, but here it is again…
