diff options
| author | Ben Culkin <scorpress@gmail.com> | 2020-11-22 15:15:11 -0500 |
|---|---|---|
| committer | Ben Culkin <scorpress@gmail.com> | 2020-11-22 15:15:11 -0500 |
| commit | c85db1bef75e5c9b7287ab7fdb6e1380d577c674 (patch) | |
| tree | 081805e198cbab9025789ca4c142003279a5a201 /src/main/java | |
| parent | 86ad50b4df6166c6f99b08d91d49fe59ee754619 (diff) | |
Add a 'context' type
This was some example code I found somewhere that seemed interesting.
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/bjc/data/Contexts.java | 82 | ||||
| -rw-r--r-- | src/main/java/bjc/data/IContext.java | 18 |
2 files changed, 100 insertions, 0 deletions
diff --git a/src/main/java/bjc/data/Contexts.java b/src/main/java/bjc/data/Contexts.java new file mode 100644 index 0000000..0769447 --- /dev/null +++ b/src/main/java/bjc/data/Contexts.java @@ -0,0 +1,82 @@ +package bjc.data; + +import java.util.*; + +public class Contexts { + public static final IContext NULL = new NullContextImpl(); + + private Contexts() { + throw new UnsupportedOperationException(); + } + + public static IContext create() { + return new ContextImpl(NULL); + } + + public static IContext create(IContext parent) { + return new ContextImpl(parent); + } + + private static class NullContextImpl implements IContext { + @Override + public IContext getParent() { + return this; + } + + @Override + public void register(String name, Object o) { + throw new UnsupportedOperationException(); + } + + @Override + public Object get(String name) { + throw new NoSuchElementException(); + } + + @Override + public <T> T get(Class<T> contract) { + throw new NoSuchElementException(); + } + } + + private static class ContextImpl implements IContext { + + private final IContext parent; + + private final Map<String, Object> objects; + + public ContextImpl(IContext parent) { + this.parent = parent; + this.objects = new HashMap<String, Object>(); + } + + @Override + public void register(String name, Object o) { + objects.put(name, o); + } + + @Override + public Object get(String name) { + if (objects.containsKey(name)) { + return objects.get(name); + } + return parent.get(name); + } + + @SuppressWarnings("unchecked") + @Override + public <T> T get(Class<T> contract) { + for (Object o : objects.values()) { + if (contract.isInstance(o)) { + return (T) o; + } + } + return parent.get(contract); + } + + @Override + public IContext getParent() { + return parent; + } + } +} diff --git a/src/main/java/bjc/data/IContext.java b/src/main/java/bjc/data/IContext.java new file mode 100644 index 0000000..a1073f1 --- /dev/null +++ b/src/main/java/bjc/data/IContext.java @@ -0,0 +1,18 @@ +package bjc.data; + +public interface IContext { + void register(String name, Object o); + + IContext getParent(); + + Object get(String name); + + <T> T get(Class<T> contract); + + default <T> T get(String name, Class<T> contract) { + Object obj = get(name); + return obj == null + ? getParent().get(name, contract) + : contract.cast(obj); + }; +} |
