We already discussed this.

On Thu, Aug 29, 2013 at 4:26 AM, Benedikt Ritter <brit...@apache.org> wrote:
> 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

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to