diff --git a/src/main/java/de/davherrmann/immutable/PathRecorder.java b/src/main/java/de/davherrmann/immutable/PathRecorder.java index 6ad7511..9bc3ac8 100644 --- a/src/main/java/de/davherrmann/immutable/PathRecorder.java +++ b/src/main/java/de/davherrmann/immutable/PathRecorder.java @@ -25,7 +25,7 @@ protected Map, PathRecorder> initialValue() private final I path; - private ThreadLocal lastPathInfo = new ThreadLocal<>(); + private static ThreadLocal lastPathInfo = new ThreadLocal<>(); private PathRecorder(Class type) { @@ -50,11 +50,11 @@ public Method methodFor(Supplier method) private PathInfo pathInfoFor(Supplier method) { - this.lastPathInfo.set(null); + lastPathInfo.set(null); method.get(); - final PathInfo pathInfo = this.lastPathInfo.get(); + final PathInfo pathInfo = lastPathInfo.get(); if (pathInfo == null) { @@ -64,7 +64,7 @@ private PathInfo pathInfoFor(Supplier method) } @SuppressWarnings("unchecked") - private T pathFor(Class type, List nestedPath) + private static T pathFor(Class type, List nestedPath) { return (T) Proxy.newProxyInstance( // type.getClassLoader(), // @@ -85,7 +85,7 @@ public static PathRecorder pathRecorderInstanceFor(Class type) return (PathRecorder) pathRecorders.get().get(type); } - private class PathInvocationHandler extends AbstractPathInvocationHandler + private static class PathInvocationHandler extends AbstractPathInvocationHandler { public PathInvocationHandler(final List nestedPath) { diff --git a/src/test/java/de/davherrmann/immutable/PathRecorderTest.java b/src/test/java/de/davherrmann/immutable/PathRecorderTest.java index 13f2ee6..35028d1 100644 --- a/src/test/java/de/davherrmann/immutable/PathRecorderTest.java +++ b/src/test/java/de/davherrmann/immutable/PathRecorderTest.java @@ -131,6 +131,19 @@ public void methodFor_returnsMethod_forPassedSupplier() throws Exception assertThat(pathRecorder.methodFor(path.pojo()::integer), is(method)); } + @Test + public void pathFor_returnsPath_whenPathWasCreatedWithPathRecorderFromDifferentThread() throws Exception + { + // given + final POJO[] path = new POJO[1]; + final Thread thread = new Thread(() -> path[0] = pathRecorderInstanceFor(POJO.class).path()); + thread.start(); + thread.join(); + + // when /then + assertThat(pathRecorder.pathFor(path[0].pojo()::integer), is(newArrayList("pojo", "integer"))); + } + private interface POJO { POJO pojo();