[aspectc-user] construction advice

Daniel Lohmann daniel.lohmann at informatik.uni-erlangen.de
Fri May 20 17:44:28 CEST 2005


Gary Duzan wrote:

>   Olaf Spinczyk <Olaf.Spinczyk at informatik.uni-erlangen.de> wrote:
>
>=>> Formula *f1 = new Formula("A");
>=>> Formula *f2 = new Formula("A");
>=>> 
>=>> I want an aspect such that f1==f2. This is related to the Flyweight 
>=>> pattern.
>=>> Is this possible?
>=>
>=>you could use an introduction to insert an 'operator new()' into Formula.
>
>   I don't think this would necessarily produce the desired result. The
>result of operator new is the storage to use. If you return the same
>storage as for a previous object, the constructor for the new object
>will still execute, writing to the same storage as the previous object,
>potentially resulting in chaos. It might be possible to avoid this with
>careful storage management, but it would likely be messy to try to apply
>as an aspect to arbitrary classes.
>
>   On the other hand, implementing the FLyweight pattern as an aspect
>does sound like a very intersting idea if it can be made to work.
>  
>
Thats right. The above works only if the construction operation is 
idempotent. A constructor can be considered as idempotent, if a) its  
execution does not induce side effects, and b) the resulting object 
state depends only on the parameters passed to the constructor. If these 
conditions hold, it is safe to execute the construction code multiple 
times on the same instance.

One can not generally assume that constructors are idempotent. However, 
for flyweight-classes they typically have to be, as otherwise the 
application of the flyweight pattern (e.g. by an aspect) would change 
the semantics of the program. In other words: A non-indempotent 
constructor usually advices to not apply the flyweight pattern to this 
class.

Anyway, technically I do not see any chance to prevent the execution of 
the constructor after a new operation. The only way to go is to do not 
use operator new, but a static factory method for object creation and 
instantiation. However, this means that you have to modify the client 
code :-(
(The compiler will show you all the positions to modify if you declare 
operator new as private in class Formula.)

Daniel



More information about the aspectc-user mailing list