Updating to Java 8 would be fine with me. You could write a [poll] email
thread the ML to gauge interest.

Gary

On Thu, Nov 12, 2015 at 11:03 AM, Cory Klein <coryfkl...@gmail.com> wrote:

> > The first hurdle here is that pool is not on Java 8. But this could be
> done
> > with other facilities like Runnable, Callable, maybe even an executor.
>
> Although Callable wouldn't be as elegant as lambdas, it would
> definitely be possible. The consumer could define a Callable:
>
> class ResourceCallable implements Callable<String> {
>   private MyResource resource;
>   public ResourceCallable(MyResource resource) {
>     this.resource = resource;
>   }
>
>   public String call() {
>     return doSomething();
>   }
>
>   public String doSomething() {
>   ...
>   }
> }
>
> Then it passes that callable's type into run with its return type:
>
>   String result = objectPool.run(ResourceCallable.class, String.class)
>
> Then maybe something like this for the definition of run:
>
> public class <T> ObjectPool {
>   ...
>   public <U> U run(Class<S> callableType, Class<U> returnType) {
>     // Leaving out exception handling for brevity
>     T obj = borrowObject();
>     S callable = callableType.getConstructor().newInstance(obj);
>     U result = callable.call();
>     returnObject(obj);
>     return result;
>   }
> }
>
> So yea, not quite as pretty as with lambdas. Is it expensive to
> upgrade the Java version of a commons lib like pool? Java 8 will be 2
> years old in March, but I'm sure there would be plenty of people
> unable to consume a version that jumps from 1.6 to 1.8.
>
> Looks like the last time we upgraded was from 1.5->1.6 in Feb 2012
> because "1.5 is out of support unless you pay for it" (git sha
> d44c8f6).
>
> On Thu, Nov 12, 2015 at 10:55 AM, Gary Gregory <garydgreg...@gmail.com>
> wrote:
> > The first hurdle here is that pool is not on Java 8. But this could be
> done
> > with other facilities like Runnable, Callable, maybe even an executor.
> >
> > Gary
> > On Nov 12, 2015 9:47 AM, "Cory Klein" <coryfkl...@gmail.com> wrote:
> >
> >> First off, hello! My name is Cory Klein and this marks my first
> >> interaction with this group. I've read through the email guidelines
> >> and I think I have something productive to discuss here.
> >>
> >> In looking at GenericObjectPool I came across a process that I believe
> >> could be improved upon and I wanted to get some early feedback on this
> >> approach before investing the time to create a full pull request.
> >>
> >> The general approach for using an object pool is to borrow an object,
> >> use it to do something, and then return it. For example:
> >>
> >> Resource resource = objectPool.borrowObject();
> >> String result = doSomething(resource);
> >> objectPool.returnObject(resource);
> >>
> >> In this case, objectPool owns instances of Resource and lends them
> >> out. However, the object pool abstraction gets slightly leaky when you
> >> consider that the consumer has a responsibility to return the object,
> >> and other consumers might be adversely affected if objects aren't
> >> returned properly.
> >>
> >> I propose augmenting ObjectPool with the following method. This code
> >> is merely demonstrative and not intended to be final:
> >>
> >> public class <T> ObjectPool {
> >>     ...
> >>
> >>     public R run(Function<T,R> function) {
> >>         T obj = null;
> >>         try {
> >>             obj = borrowObject();
> >>         } catch (Exception e) {
> >>             throw new RuntimeException("Unable to get object from
> pool");
> >>         }
> >>         R returnVal = null;
> >>         try {
> >>             returnVal = function(T);
> >>         } catch (Exception e) {
> >>             throw new RuntimeException("Supplied lambda produced an
> >> exception");
> >>         } finally {
> >>             this.returnObject(obj);
> >>             return returnVal;
> >>         }
> >>     }
> >> }
> >>
> >> With this idea, consumers can instead provide the object pool with a
> >> function to run using the required resource, leaving the object pool
> >> complete ownership of the resource and ensuring that resources can
> >> always be returned to the pool. The borrow/return example from above
> >> becomes merely:
> >>
> >> String result = objectPool.run((resource) -> doSomething(resource));
> >>
> >> In summary, some positive reasons I can think of to make this change
> are:
> >>
> >> * Improve a leaky abstraction
> >> * Less code needed on the consuming side
> >> * Improved reliability
> >>
> >> I'm having a harder time coming up with reasons why this change is
> >> bad, but I think this may be due to a lack of intimacy with the
> >> library as it exists now. Are there any reasons that are immediately
> >> apparent to you?
> >>
> >> Thanks,
> >>
> >> Cory Klein
> >>
> >> ---------------------------------------------------------------------
> >> 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
>
>


-- 
E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to