Mercurial > jhg
comparison src/org/tmatesoft/hg/util/Adaptable.java @ 356:91d75e1bac9f
Consistent approach to deal with adaptable objects. Give adaptable precedence over instanceof to allow conditional response when classes do implement desired interface
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Tue, 06 Dec 2011 14:25:52 +0100 |
| parents | 1a7a9a20e1f9 |
| children |
comparison
equal
deleted
inserted
replaced
| 355:f2c11fe7f3e9 | 356:91d75e1bac9f |
|---|---|
| 23 * @author TMate Software Ltd. | 23 * @author TMate Software Ltd. |
| 24 */ | 24 */ |
| 25 public interface Adaptable { | 25 public interface Adaptable { |
| 26 | 26 |
| 27 <T> T getAdapter(Class<T> adapterClass); | 27 <T> T getAdapter(Class<T> adapterClass); |
| 28 | |
| 29 class Factory<T> { | |
| 30 | |
| 31 private final Class<T> adapterClass; | |
| 32 | |
| 33 public Factory(Class<T> adapterClass) { | |
| 34 assert adapterClass != null; | |
| 35 this.adapterClass = adapterClass; | |
| 36 } | |
| 37 | |
| 38 public T get(Object target) { | |
| 39 return getAdapter(target, adapterClass, null); | |
| 40 } | |
| 41 | |
| 42 public T get(Object target, T defaultValue) { | |
| 43 return getAdapter(target, adapterClass, defaultValue); | |
| 44 } | |
| 45 | |
| 46 /** | |
| 47 * Try to adapt target to specified class, resort to defaultValue when not possible. | |
| 48 * Instance lookup order is as follows: first, target is checked for being {@link Adaptable} and, if yes, | |
| 49 * consulted for adapter. Then, plain {@link Class#isInstance(Object) instanceof} checks if target itself is | |
| 50 * of desired type. {@link Adaptable} check comes first to allow classed that are in fact <code>instanceof</code> | |
| 51 * desired type to respond to the demand conditionally | |
| 52 * | |
| 53 * @param target object to adapt, <code>null</code> value, although meaningless, is tolerable. | |
| 54 * @param adapterClass desired target class | |
| 55 * @param defaultValue value to use if target cannot be adapted to desired class, may be <code>null</code> | |
| 56 * @return instance of the desired class | |
| 57 */ | |
| 58 public static <C> C getAdapter(Object target, Class<C> adapterClass, C defaultValue) { | |
| 59 if (target instanceof Adaptable) { | |
| 60 return ((Adaptable) target).getAdapter(adapterClass); | |
| 61 } | |
| 62 if (adapterClass.isInstance(target)) { | |
| 63 return adapterClass.cast(target); | |
| 64 } | |
| 65 return defaultValue; | |
| 66 } | |
| 67 } | |
| 28 } | 68 } |
