4.14. Chaining Closures

Problem

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

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.

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.

See Also

Jakarta Commons Functor in the Commons Sandbox introduces a UnaryProcedure interface that is equivalent to Closure. Two or more UnaryProcedure instances can be chained together using the CompositeUnaryProcedure class. For more information about CompositeUnaryProcedure, see the Commons Functor page at http://jakarta.apache.org/commons/sandbox/functor.

Get Jakarta Commons Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.