On Mon, Sep 19, 2011 at 1:07 PM, ralph.goers @dslextreme.com < ralph.go...@dslextreme.com> wrote:
> > > On Mon, Sep 19, 2011 at 10:07 AM, John Vasileff <john.li...@gmail.com>wrote: > >> >> What do you think about an optional LazyRenderMessage interface (I'm sure >> there is a better name for this) that could be used by Message types that >> have expensive constructers? >> >> interface LazyRenderMessage { >> void render(); >> } >> >> The logger would call render() immediately after checking isEnabled for >> level and marker. So, this should not affect serialization - the object >> will either be fully constructed or discarded right away. >> >> This would allow ThreadDumpMessage Thread.getAllStackTraces() work to be >> avoided unless logging will actually occur (or is likely to occur in the >> case of complex filters). >> >> The benefit of course is that trace(THREAD_DUMP_MARKER, new >> ThreadDumpMessage()) could be left in production code without if >> isTraceEnabled(...) { ... }, and with very little overhead - creating a >> short lived object that does nothing in the constructor is pretty cheap >> these days. >> >> This would also help for Message types like ParameterizedMessage to avoid >> parseArguments(arguments) when they are created by application code. >> > > I see some merit in this idea. But you are right, it really needs a better > name. > > One other point, though, is that there should always be a constructor that allows immediate rendering. I could easily see the ThreadDumpMessage being used for other purposes and never being passed to a logger. For example, I could create two ThreadDumpMessages at slightly different points in time and then only print the differences between them. Ralph