Sylvain Wallez wrote:
>
> Carsten Ziegeler a écrit :
> >
> > Hi,
> >
> > I just reviewed a little bit of the serializers code, and saw this:
> > AbstractSerializer implements: Recyclable
> > AbstractTextSerializer inherits from AbstractSerializer and implements
> > Poolable
> > TextSerializer|XMLSerializer... inherit from AbstractTextSerializer  and
> > implement Poolable
> >
> > This seems to me that there are too many implements in this inheritance
> > chain.
>
> You can remove Recyclable from AbstractSerializer... but it will still
> be Recyclable because it extends AbstractXMLProducer (through
> AbstractXMLPipe) which itself implements Recyclable !
>
> The main reason for AbstractXMLPipe to be Recyclable is to break the
> link with its XMLConsumer and thus allow it to be GC'ed.
>

Yupp! Another one in the chain. I just forget it to mention.

> > Before I start doing something, is is OK to remove the two
> > implements Poolable statements (from AbstractTextSerializer and
> > TextSerializer|XMLSerializer
> > etc)?
>
> Why don't you want them to be poolable ? Since they rely on Trax
> transformers for serialization, it is IMO good for performance to have
> them poolable. Or do you want to remove implements for interfaces
> already implemented by super-classes (i.e. only on TextSerializer &
> XMLSerializer) ?
>

It seems that I didn't make me clear: Recyclable inherits from Poolable,
so if a superclass is already Recyclable, it is superfluous to implement
this interface (or Poolable) in one of it's subclasses.

> Now this comes to the coding rules we could adopt regarding interfaces
> (be them lifecycle interfaces or not). I see to possible rules :
>
> 1 - a class shouldn't explicitly implement an interface which is already
> implemented by any of its superclasses.
>

+1

> 2 - a class should explicitly implement every interface whose methods it
> redefines, even if already implemented by one of its superclasses. It
> should also implement marker interfaces which it relies on (e.g.
> SingleThreaded for statefull classes).
>
> IMO, rule 2 leads to more robust code, since it prevents
> lifecycle/lifestyle of a class to be broken if an update to one of its
> superclasses removes the implementation of an interface.
>

No, unfortunately this is not true! If a superclass used to implement
Recyclable
and the subclass, too, the subclass will have a super.recycle() in its own
recycle implementation. Removing the Recyclable interface from the
superclass
will then break the subclass unavoidable. (The same applies to Configurable,
Parameterizable etc., all interfaces having methods.)
So I think, that the lifecycle behaviour of an implementation can only be
changed if there is no subclass. And this leads me to your rule 1: as the
superclass lifecycle can never change, I can (and must) rely on this and
therefore do not need to explicitly state this interface in the implements
clause
of a subclass.

> This also reminds me of a discussion you started some time ago on
> avalon-dev to have Poolable extend ThreadSafe. I tried to second you,
> but this proposal didn't got acceptance at that time... See
> http://marc.theaimsgroup.com/?l=avalon-dev&m=100107230514463&w=2
>
> What do you think ?
>

You mean Poolable and SingleThreaded, I think. That thread had the fade
a lot of threads have - not only in Avalon, but in Cocoon, Xalan, Xerces and
I
guess in many other projects as well. Someone has an idea/suggestion and
this starts a mind-blowing thread where a lot of developers throw their
ideas in and suddenly all loose interest and nothing really happens.
I can't count the votes and suggestions I started in the last 6 weeks here
in the Cocoon list without a result. Just see what has happened to the
simple
question "if an action is allowed as a root element in the pipeline".

Regards,
Carsten


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to