I'll give you a good reason... file access inevitably risks
IOExceptions, and exceptions don't propogate well from a static block.

        That is to say, when the ClassLoader invokes the static block, it is
not invoked from within your code.  The exception gets thrown and propogates
through the *ClassLoader* stack rather than your application code, resulting
in an application that simply won't start for mysterious reasons, forcing a
long and drawn out investigation.

        The only reason I use static blocks any more is to initialize
constants that require more than 1 line to initialize correctly (such as
NumberFormats, where you may have additional methods to invoke once they are
corrected) or are order-dependent, so that if a field gets renamed and/or
the members are resorted the code doesn't blow up.
Even these examples are pretty scarce and serve very special purposes.

Best Practice: Don't do anything in a static block that can throw an
exception without good reason.  

        If you have something you'd like to initialize in a static way,
create a static synchronized accessor and allow the accessor to throw
exceptions as needed.  i.e.
a singleton-like implementation:

private static Config configInstance = null;
public static final synchronized getConfig()
{
        if(configInstance==null)
        {
                // create instance and read config;
                // this can throw any RuntimeExceptions
                // and still be compatible with the signature
        }
        return configInstance;
}

David Hibbs, ACS
Staff Programmer / Analyst
American National Insurance Company

> Id be wary about using static blocks for anything involving 
> file access. I
> cant give you a good reason for that, but it just seems like 
> a bad idea to
> me.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to