Common Java Cookbook

Edition: 0.19

Download PDF or Read on Scribd

Download Examples (ZIP)

4.14. Chaining Closures

4.14.1. Problem

An object needs to be acted on by a series of Closure instances.

4.14.2. Solution

Use ChainedClosure to create a chain of Closure instances that appears as a single Closure. A ChainedClosure takes an array of Closure objects and passes the same object sequentially to each Closure in the chain. This example sends an object through a ChainedClosure containing two stages that modify different properties on the object:

Closure fuel = new Closure( ) {
    public void execute(Object input) {
        Shuttle shuttle = (Shuttle) input;
        shuttle.setFuelPercent( 100.0 );
    }
}
Closure repairShielding = new Closure( ) {
    public void execute(Object input) {
        Shuttle shuttle = (Shuttle) input;
        shuttle.setShieldingReady( true );
    }
}
Closure[] cArray = new Closure[] { repairShielding, fuel };
Closure preLaunch = new ChainedClosure( cArray );
Shuttle endeavour = new Shuttle( );
endeavour.setName( "Endeavour" );
System.out.println( "Shuttle before preLaunch: " + shuttle );
preLaunch.execute( endeavour );
System.out.println( "Shuttle after preLaunch: " + shuttle );

A Shuttle object is passed through a ChainedClosure, preLaunch, which consists of the stages fuel and repairShielding. These two Closure objects each modify the internal state of the Shuttle object, which is printed out both before and after the execution of the preLaunch Closure:

Shuttle before preLaunch: Shuttle Endeavour has no fuel and no shielding.
Shuttle before preLaunch: Shuttle Endeavour is fueled and is ready for reentry.

4.14.3. Discussion

This example should remind you of Recipe 4.11. When chaining Transformer objects, the result of each transformation is passed between stages—the results of stage one are passed to stage two, the results of stage two are passed to stage three, and so on. A ChainedClosure is different; the same object is passed to each Closure in sequence like a car moving through a factory assembly line.


Creative Commons License
Common Java Cookbook by Tim O'Brien is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License.
Permissions beyond the scope of this license may be available at http://www.discursive.com/books/cjcook/reference/jakartackbk-PREFACE-1.html. Copyright 2009. Common Java Cookbook Chunked HTML Output. Some Rights Reserved.