[[caching:intro|Intro]]
[[caching:ex1|Ex1]]
[[caching:ex2|Ex2]]
[[caching:ex3|Ex3]]
[[caching:ex4|Ex4]]====== Caching: Constant cache ======
===== Using inter-type declarations =====
**Task:** Pass ''tests.BoundsConstantCache''.
Instead of making the (very) conservative approximation of ''getBounds()'' from the previous part, write an aspect instead that remembers the return value from the first time ''getBounds()'' has been called on a certain ''Group'', and returns that first ''Rectangle'' for every subsequent call.
Use an inter-type declaration of a field on the ''Group'' class to store the cache value.
A correct implementation should pass the tests of suite ''tests.BoundsConstantCache''.
When done, remove the aspect from your build path before continuing with the next part.
===== Using several aspect instances =====
Imagine that a ''Group'' is [[wp>Serialization|serialized]] to some storage medium. If we use inter-type declarations to introduce a new field for the ''Group'' class, then this field will be included in the serialized data of a ''Group'' (so the schema changes). This is undesirable.
To avoid this, write a new version of the above aspect that does not change the fields of the ''Group'' class.
Store the field in the aspect itself and use the ''perthis'' instantiation strategy to have one aspect aspect instance for each advised ''Group'' object.
A correct implementation should also pass the tests of suite ''tests.BoundsConstantCache''.
When done, remove the aspect from your build path before continuing with the next part.
===== Reusable caching aspect =====
A //reusable// caching aspect seems very useful. Create a generic caching aspect from your previous result by extracting at least:
* The type of the cache value: i.e. ''Rectangle'' should not be hardcoded, use a type variable instead
* The operation being cached: i.e. ''Group.getBounds()'' should not be hardcoded, make this pointcut abstract
Then reimplement your solution using this generic caching aspect. The new implementation should still pass the tests of suite ''tests.BoundsConstantCache''.
----
Keep the last of your caching aspects active and continue with [[caching:ex3|Exercise 3]].