JavaDude Tools->Annotations->Annotations examples
Mixin Example
Note: I'm not a fan of the "I" prefix on interfaces, but I'm using it here to make it more clear which types are interfaces vs classes.
Suppose we have the following three interfaces:
``` package sample;
import java.util.List;
public interface IFlightAgent { List getFlight(); void reserve(IFlight flight); }
public interface ICarAgent { List getCars(); void reserve(ICar car); }
public interface IHotelAgent { List getHotels(); void reserve(IHotel hotel); } ```
each with a corresponding implementation (FlightAgentImpl, CarAgentImpl, HotelAgentImpl), and we'd like to create a single aggregate TravelAgent that "mixes in" all of the function of these three.
You can specify the following:
``` package sample;
import com.javadude.annotation.Bean; import com.javadude.annotation.Delegate;
@Bean(delegates = { @Delegate(type = IHotelAgent.class, property = "hotelAgent", instantiateAs = HotelAgentImpl.class), @Delegate(type = ICarAgent.class, property = "carAgent", instantiateAs = CarAgentImpl.class), @Delegate(type = IFlightAgent.class, property = "flightAgent", instantiateAs = FlightAgentImpl.class) } ) public class TravelAgent extends TravelAgentGen implements IHotelAgent, ICarAgent, IFlightAgent {
} ```
This will generate TravelAgentGen that creates instances of the "impl" classes and delegation methods for each of the specified interfaces:
``` // CODE GENERATED BY JAVADUDE BEAN ANNOTATION PROCESSOR // -- DO NOT EDIT - THIS CODE WILL BE REGENERATED! -- package sample;
@javax.annotation.Generated( value = "com.javadude.annotation.processors.BeanAnnotationProcessor", date = "Thu Aug 14 23:25:48 EDT 2008", comments = "CODE GENERATED BY JAVADUDE BEAN ANNOTATION PROCESSOR; DO NOT EDIT! THIS CODE WILL BE REGENERATED!") public abstract class TravelAgentGen { private sample.IHotelAgent hotelAgent_; private sample.ICarAgent carAgent_; private sample.IFlightAgent flightAgent_; public TravelAgentGen() { ; hotelAgent_ = new sample.HotelAgentImpl(); carAgent_ = new sample.CarAgentImpl(); flightAgent_ = new sample.FlightAgentImpl(); }
public java.util.List<sample.IHotel> getHotels() {
return hotelAgent_.getHotels();
}
public void reserve(sample.IHotel hotel) {
hotelAgent_.reserve(hotel);
}
public java.util.List<sample.ICar> getCars() {
return carAgent_.getCars();
}
public void reserve(sample.ICar car) {
carAgent_.reserve(car);
}
public java.util.List<sample.IFlight> getFlight() {
return flightAgent_.getFlight();
}
public void reserve(sample.IFlight flight) {
flightAgent_.reserve(flight);
}
@Override
public java.lang.String toString() {
return getClass().getName() + '[' + paramString() + ']';
}
protected java.lang.String paramString() {
return "";
}
} ```
JavaDude Tools->Annotations->Annotations examples