Convert Static to Dynamic Construction

Refactoring contributed by Gerard M. Davison

You have classes that have static compile time dependencies on classes that can only be built on a specific platform.

Make use of the java.lang.reflect to break the static dependency.





   import org.davison.data.jdbc.JDBCProvider;



   .

   .

   .





   DataProvider dp = new JDBCProvider();








   try

   {

      DataProvider dp = (DataProvider)

         Class.forName("org.davison.data.jdbc.JDBCProvider").newInstance();

   }

   catch (IllegalAccessException iae)

   {

      // Convert exception to error to preseve the interface.

      //

      

      throw new IllegalAccessError(iae.getMessage());

   }

   catch (InstantiationException ie)

   {

      // Convert exception to error to preseve the interface.

      //

      

      throw new InstantiationError(ie.getMessage());      

   }

   catch (ClassNotFoundException cnfe)

   {

      // Convert exception to error to preseve the interface.

      //



      throw new NoClassDefFoundError(cnfe.getMessage());

   }





Motivation

In some cases you have to provide drivers to provide different functionality depending on the situation. You might have classes that on a given platform need to access some sun.* classes to perform a specific function. For example a class to access WinHelp needs to get the window handle via the sun.awt.windows.WWindowPeer classes.

There might also be the desire to only provide certian functionality to a given sub-set of users. This is the equivalent of being able to compile out code without having to alter the source or use pre-compilers.

This method can be used with good effect with application frameworks where you do not know which class need to be used at compile time.

Mechanics

Example

| Refactoring Home | | Alphabetical List |