Created
September 14, 2011 19:43
-
-
Save isopov/1217563 to your computer and use it in GitHub Desktop.
Code for answer on so question: http://stackoverflow.com/questions/7420900/registry-optimization-with-guice
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.HashMap; | |
import java.util.Map; | |
import java.util.Set; | |
import javax.inject.Inject; | |
import com.google.inject.Binder; | |
import com.google.inject.Guice; | |
import com.google.inject.Injector; | |
import com.google.inject.Module; | |
import com.google.inject.multibindings.Multibinder; | |
public class Test { | |
public static void main(String[] args) { | |
Injector injector = Guice.createInjector(new Module() { | |
@Override | |
public void configure(Binder binder) { | |
@SuppressWarnings("rawtypes") | |
Multibinder<Converter> converterBinder = Multibinder.newSetBinder(binder, Converter.class); | |
converterBinder.addBinding().to(StringBooleanConverter.class); | |
converterBinder.addBinding().to(BooleanStringConverter.class); | |
} | |
}); | |
ConverterRegistryImpl registry = injector.getInstance(ConverterRegistryImpl.class); | |
System.out.println(registry.converterRegistry.size()); | |
} | |
public static class ConverterRegistryImpl { | |
private Map<Key, Converter<?, ?>> converterRegistry = new HashMap<Key, Converter<?, ?>>(); | |
@Inject | |
public void setConverters(@SuppressWarnings("rawtypes") Set<Converter> converters) { | |
for (Converter<?, ?> converter : converters) { | |
register(converter.getFromClass(), converter.getToClass(), converter); | |
} | |
} | |
private void register(Class<?> fromType, Class<?> toType, Converter<?, ?> converter) { | |
converterRegistry.put(new Key(fromType, toType), converter); | |
} | |
} | |
public static class Key { | |
Class<?> first; | |
Class<?> second; | |
public Key(Class<?> first, Class<?> second) { | |
this.first = first; | |
this.second = second; | |
} | |
} | |
private static class StringBooleanConverter implements Converter<String, Boolean> { | |
@Override | |
public Boolean convert(String input) { | |
return Boolean.valueOf(input); | |
} | |
@Override | |
public Class<String> getFromClass() { | |
return String.class; | |
} | |
@Override | |
public Class<Boolean> getToClass() { | |
return Boolean.class; | |
} | |
} | |
private static class BooleanStringConverter implements Converter<Boolean, String> { | |
@Override | |
public String convert(Boolean input) { | |
return String.valueOf(input); | |
} | |
@Override | |
public Class<Boolean> getFromClass() { | |
return Boolean.class; | |
} | |
@Override | |
public Class<String> getToClass() { | |
return String.class; | |
} | |
} | |
private interface Converter<E, T> { | |
T convert(E input); | |
Class<E> getFromClass(); | |
Class<T> getToClass(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment