Path: csiph.com!usenet.pasdenom.info!gegeweb.org!eternal-september.org!feeder.eternal-september.org!mx04.eternal-september.org!.POSTED!not-for-mail From: Steven Simpson Newsgroups: comp.lang.java.programmer Subject: Re: Wormholes Date: Thu, 06 Sep 2012 11:47:17 +0100 Organization: A noiseless patient Spider Lines: 65 Message-ID: References: <0ska4895k2mp2j5fb5p4qnue7lsbdpoeoo@4ax.com> <9mbhh9-mce.ln1@s.simpson148.btinternet.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Injection-Info: mx04.eternal-september.org; posting-host="f4ac9483e05a3d03aeccc41ff751995f"; logging-data="7903"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/6qkVcsHrxMYf6b4At0Xme5kCscOflhAA=" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 In-Reply-To: Cancel-Lock: sha1:K6JRAmmkV8/k7NMeV7d6WdqH7vw= Xref: csiph.com comp.lang.java.programmer:18571 On 06/09/12 10:32, Andreas Leitgeb wrote: > Steven Simpson wrote: >> So, we throw in a ThreadLocal: >> >> static ThreadLocal context = ...; >> >> class MyAppSpecBox extends Box { >> InputStream getFieldContent() { >> Context ctxt = context.get(); >> ... >> } >> } >> >> We set it before invoking the hierarchy: >> >> Box root = cache.fetch(key); >> Context ctxt = new Context(...); >> context.set(ctxt); >> InputStream in = root.getContent(); > What strikes me odd in this scenario is the coincidence of > two things: > There's *only one* specific Box-subclass, that requires > specific extra information > The code that kicks off processing of the object tree does > know about this specific need and does know how to > cater to it specifically (and the specific piece of > information is even available at that place). The odd part is that the custom box is lost in the structure before a context can be supplied to it, which is the result of caching the structure, and only knowing the context just when recovering the structure from the cache. That means you either find the custom box to inform it of the context, or you leave the context somewhere the box will look. > Then either you end up with "invoking" code, that sets up > a number of different ThreadLocal<...>s for those specific > Boxes (that may or may not actually show up in the tree), > or you still set up only one such ThreadLocal, > and a couple of specific Boxes use it. > > in the former case it seems like the Box abstraction > completely missed the point. I don't get what you mean, but the point of the Box abstraction is just to handle the aspects common to all boxes: they have some box-type-specific fields, followed by zero or more nested boxes. It's not aware of the application-specific Context. > In the latter case, it seems as if it might then turn out to > be reasonable to modify the Box baseclass to pass along the > Context directly (even if some Boxes still don't need it): > > class Box { > InputStream getContent(Context ctx) { This is out of the question - the library to which Box belongs knows nothing about the application that defines Context. Cheers! -- ss at comp dot lancs dot ac dot uk