What's your need for the direct constructor?
-- Rob On 25 January 2013 15:49, Hiram Chirino <hi...@hiramchirino.com> wrote: > Let me clarify, I have no problem with adding Factories and using them > everywhere possible. Just don't take my access away from direct > constructors. > > > On Fri, Jan 25, 2013 at 9:39 AM, Rob Godfrey <rob.j.godf...@gmail.com>wrote: > >> In general dependency on implementation is bad, dependency on interface is >> better. One of the problems we've had with Qpid historically is it become >> hard to test as we have dependencies on implementation everywhere. >> >> From an end user perspective the difference is only replacing >> >> X x = new X(); >> >> with >> >> X x = XFactory.newInstance(); >> >> But it makes it a lot easier to properly describe the functionality being >> returned. For implementation reasons, the concrete class may have public >> methods that are not intended to be exposed to the application programmer >> but only to other cooperating classes. To avoid confusion, and to make it >> clear to us the delta between the "shared" API and the API extensions that >> we are supporting for the pure Java implementation the interfaces seem like >> the right way to go for me. >> >> The idea is that those who need the extension features will still have a >> very clear way to get the implementation that provides these, without ever >> having to cast. >> >> -- Rob >> >> >> >> >> >> On 24 January 2013 20:03, Rafael Schloming <r...@alum.mit.edu> wrote: >> >> > On Thu, Jan 24, 2013 at 5:06 AM, Rob Godfrey <rob.j.godf...@gmail.com >> > >wrote: >> > >> > > On 23 January 2013 17:36, Phil Harvey <p...@philharveyonline.com> >> wrote: >> > > > >> > > > As part of the Proton JNI work, I would like to remove all calls to >> > > > proton-j implementation constructors from "client code". I intend >> that >> > > > factories will be used instead [1], thereby abstracting away whether >> > the >> > > > implementation is pure Java or proton-c-via-JNI. >> > > > >> > > > I'd like to check that folks are happy with me making this change, >> and >> > to >> > > > mention a couple of problems I've had. >> > > > >> > > > In this context, "client code" is anything outside the current >> > > > sub-component, where our sub-components are Engine, Codec, Driver, >> > > Message >> > > > and Messenger, plus each of the contrib modules, and of course third >> > > party >> > > > code. >> > > > >> > > > To enforce this abstraction, I am planning to make the constructors >> of >> > > the >> > > > affected classes package-private where possible. I believe that, >> > > although >> > > > third party projects might already be calling these constructors, it >> is >> > > > acceptable for us to change its public API in this manner while >> Proton >> > is >> > > > such a young project. >> > > > >> > > >> > > +1 to all of the above >> > > >> > > > >> > > > Please shout if you disagree with any of the above. >> > > > >> > > > Now, onto my problem. I started off with the >> > > org.apache.qpid.proton.engine. >> > > > impl package, and found that o.a.q.p.hawtdispatch.impl.AmqpTransport >> > > calls >> > > > various methods on ConnectionImpl and TransportImpl, so simply using >> a >> > > > Connection and Transport will not work. I don't know what to do >> about >> > > > this, and would welcome people's opinions. >> > > > >> > > >> > > So, the simplest change would be to change the factories to use >> > > covariant return types >> > > >> > > e.g. EngingFactoryImpl becomes: >> > > >> > > @Override >> > > public ConnectionImpl createConnection() >> > > { >> > > return new ConnectionImpl(); >> > > } >> > > >> > > @Override >> > > public TransportImpl createTransport() >> > > { >> > > return new TransportImpl(); >> > > } >> > > >> > > >> > > ... etc >> > > >> > > Code that requires the extended functionality offered by the pure Java >> > > implementation can thus instantiate the desired Factory directly. >> > > >> > >> > What's the point of going through the factory in this scenario rather >> than >> > directly instantiating the classes as Hiram suggests? Is there some class >> > of thing the factory would/could do that the constructor can't/shouldn't? >> > >> > A second refinement might be to actually separate out the interface >> > > and implementation within the pure Java implementation so that we have >> > > a well defined "extended" Java API. This interface could then be the >> > > return type of the factory. >> > > >> > >> > Maybe I'm misunderstanding, but what's the point of using an interface >> here >> > if you're still locked into the pure Java impl? Are you expecting to swap >> > out that impl under some circumstances? >> > >> > --Rafael >> > >> > > > > -- > > ** > > *Hiram Chirino* > > *Engineering | Red Hat, Inc.* > > *hchir...@redhat.com <hchir...@redhat.com> | fusesource.com | redhat.com* > > *skype: hiramchirino | twitter: @hiramchirino<http://twitter.com/hiramchirino> > * > > *blog: Hiram Chirino's Bit Mojo <http://hiramchirino.com/blog/>*