On Sun, 2006-02-19 at 17:56 -0800, Craig McClanahan wrote:

> Simon,
> 
> Could you do me a favor and publicize this in the Struts community as
> well?  The framework code there is littered with static log instances
> to. 

Will do.

>  You might also want to add some notes related to using Log instances
> in Serializable classes (see below). 

Will do that also.

> 
> MyFaces folks,
> 
> There *is* a JSF-specific consideration to think about, if you have
> classes that implement StateHolder (like a UIComponent
> implementation).  Log instances will generally *not* be serializable,
> so you will need to deal specially with them in saveState() and
> restoreState() methods.  The simplest thing is to just not save them,
> and do a "new" operation again in restoreState(). 

Sorry but I don't understand. Why won't the normal approach work?

  public class SomeComponent .... {
    private Log log = LogFactory.getLog(SomeComponent.class);
    ...
  }

AIUI, the log object won't be saved in the saveState method, but it will
be recreated nicely during the RestoreView phase when a new instance is
created for the state to be restored into.

> 
> Along the same lines, if your class implements Serializable, you will
> need to mark the instance variable transient.  I've started using the
> following pattern in my Serializable classes, which would work inside
> a StateHolder as well: 
> 
>     private transient Log log = null;
> 
>     private Log log() {
>         if (log == null) {
>             log = LogFactory.getLog(...);
>         }
>         return log;
>     }
> 
> and a typical call looks like: 
> 
>     if (log().isDebugEnabled()) {
>        log().debug("...");
>     }

Ok, transient is needed here. But apart from that why won't the standard
approach work?

  public class SomeThing implements Serializable {
    private transient Log log = LogFactory.getLog(SomeThing.class);
    ...
    if (log.isDebugEnabled()) {
      log.debug("...");
    }
  }

Doesn't the log object get recreated when the deserialization occurs?

The log() method is quite a lot of boilerplate, and also imposes an
additional method call for every isDebugEnabled() call. [The extra call
inside the guard is not really relevant as output *is* going to occur at
this point which greatly outweighs the price of the method call].

Cheers,

Simon

Reply via email to