2013/8/27 Oliver Heger <oliver.he...@oliver-heger.de>

> Am 27.08.2013 07:06, schrieb Phil Steitz:
> > On 8/26/13 11:28 AM, Oliver Heger wrote:
> >> Am 26.08.2013 16:18, schrieb Phil Steitz:
> >>>
> >>> On Aug 26, 2013, at 7:38 PM, Oliver Heger <
> oliver.he...@oliver-heger.de> wrote:
> >>>
> >>>> Am 25.08.2013 18:45, schrieb Adrian Crum:
> >>>>> +1
> >>>>>
> >>>>> -Adrian
> >>>>>
> >>>>> On 8/25/2013 9:26 AM, James Carman wrote:
> >>>>>> AtomicReference?
> >>>> There are multiple aspects here. One is the safe publishing of a value
> >>>> written into the member field. This can be achieved by atomic
> >>>> references, synchronization, or a volatile field.
> >>>>
> >>>> The other aspect is that such a field of a static utility class is
> >>>> pretty global. You cannot have different values for different threads.
> >>>>
> >>>> So the question is, is it good design to have static utility classes
> >>>> with state?
> >>> Excellent point.  The key question to ask is are there use cases where
> different threads in the same JVM are really going to want different
> default factories.  I wonder if any actual user of the current code has
> ever wanted this.
> >>>
> >> In this special case, I *assume* that there are hardly any concrete use
> >> cases, but of course, we cannot be sure.
> >>
> >> However, there may be other examples in [configuration]. Would it make
> >> sense to be homogeneous here, i.e. use the same design principles for
> >> all classes?
> >
> > Yes and the non-static approach is certainly more flexible, so on
> > balance I think you and James are right.
>
> Many thanks for the feedback! So I think I will go for the "bean-based
> approach" then.
>

One possibility to have the best of both worlds is to create a class with
all static methods that delegates to an instance that is hold in a static
field. This would be for all those that want the default behavior. Those
who need customized behavior could instanciate the delegate directly an
configure it the way they like:

public final class BeanHelperUtils {

   private static final BeanHelper DELEGATE = new BeanHelper(new
DefaultBeanFactory());

   public static Bean someMethod() {
      return DELEGATE.someMethod();
   }

}

public class BeanHelper {

   private final BeanFactory factory;

   public BeanHelper(BeanFactory factory) {
      this.factory = factory;
   }

   public Bean someMethod() {
      factory.createBean();
   }
}

client code can either call BeanHelperUtils.someMethod()
or create a BeanHelper with the appropriate BeanFactory instance...

just my 2 cents
Benedikt


>
> Oliver
>
> >
> > Phil
> >>
> >> Oliver
> >>
> >>> Phil
> >>>> For users, it may be more convenient to simply access functionality
> >>>> through static methods, especially if the default values for static
> >>>> member fields are reasonable for most use cases. However, such a
> design
> >>>> makes it impossible to use the represented functionality with
> different
> >>>> settings in parallel.
> >>>>
> >>>> Also, I am not sure whether complex class loader scenarios (e.g. an
> >>>> application server or an OSGi container) may cause problems with the
> >>>> static approach.
> >>>>
> >>>> Oliver
> >>>>
> >>>>>> On Sunday, August 25, 2013, Phil Steitz wrote:
> >>>>>>
> >>>>>>> On 8/24/13 11:33 AM, Oliver Heger wrote:
> >>>>>>>> Hi all,
> >>>>>>>>
> >>>>>>>> regarding a principle design question I would like to get your
> opinion:
> >>>>>>>>
> >>>>>>>> In [configuration] there are a few static utility classes. One of
> them
> >>>>>>>> is BeanHelper which supports the creation of beans from
> configuration
> >>>>>>>> data. The actual bean creation is done by a BeanFactory which can
> be
> >>>>>>>> configured using the static (currently unsynchronized)
> >>>>>>>> setDefaultBeanFactory() method.
> >>>>>>>>
> >>>>>>>> Sebb stated correctly that this approach is thread-hostile [1]. An
> >>>>>>>> alternative could be to make BeanHelper a non-static class which
> can be
> >>>>>>>> instantiated and configured per instance. This would be more
> flexible
> >>>>>>>> and would also simplify testing of client code (just pass in a
> mock
> >>>>>>>> object). The drawback is that clients now always would have to
> >>>>>>>> create an
> >>>>>>>> instance, so the API becomes slightly more verbose - in fact, most
> >>>>>>>> clients will probably never have the requirement to change the
> default
> >>>>>>>> bean factory.
> >>>>>>>>
> >>>>>>>> So, the question is, what do you prefer? The static approach like
> >>>>>>>> Object myBean = BeanHelper.createBean(...);
> >>>>>>>>
> >>>>>>>> or using an instance as in
> >>>>>>>> BeanHelper helper = new BeanHelper(myFactory);
> >>>>>>>> // or use no-args ctor for default factory
> >>>>>>>> Object myBean = helper.createBean(...);
> >>>>>>> Personally, I would like the static method better as a user.
> >>>>>>> Synchronizing access to the static factory field would seem to fix
> >>>>>>> the problem unless I am missing something.  Also, I would not
> expect
> >>>>>>> lots of concurrent access to the getter/setter for this field in
> >>>>>>> normal use cases , so the performance overhead of the sync would be
> >>>>>>> immaterial.  Having the setter there may also be a little easier
> for
> >>>>>>> dependency injection.
> >>>>>>>
> >>>>>>> Phil
> >>>>>>>> TIA
> >>>>>>>> Oliver
> >>>>>>>>
> >>>>>>>> [1] https://issues.apache.org/jira/browse/CONFIGURATION-486
> >>>>>>>>
> >>>>>>>>
> ---------------------------------------------------------------------
> >>>>>>>> To unsubscribe, e-mail:
> >>>>>>>> dev-unsubscr...@commons.apache.org<javascript:;>
> >>>>>>>> For additional commands, e-mail:
> >>>>>>>> dev-h...@commons.apache.org<javascript:;>
> >>>>>>>
> ---------------------------------------------------------------------
> >>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>>>>>> <javascript:;>
> >>>>>>> For additional commands, e-mail:
> >>>>>>> dev-h...@commons.apache.org<javascript:;>
> >>>>>
> >>>>> ---------------------------------------------------------------------
> >>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >>>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >>> For additional commands, e-mail: dev-h...@commons.apache.org
> >>>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> For additional commands, e-mail: dev-h...@commons.apache.org
> >>
> >>
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> > For additional commands, e-mail: dev-h...@commons.apache.org
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>


-- 
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter

Reply via email to