This code is pretty rough. Try sending your emails as RTF or setting
your right margin to something like 150 or 200.
-bp
On Jan 22, 2009, at 12:03 PM, Alen Vrečko wrote:
>
> Hi,
>
> correct me if I am wrong guys,
>
> The point is here
>
> static class Leg {
> @Inject Foot foot;
>
> Notice you're injecting a Foot but how do you know which Foot?
>
> You can't to
>
> static class Leg {
> @Inject @Left @Right Foot foot;
>
> that makes no sense
>
> static class Robot {
> @Inject @Left Leg leftLeg;
> @Inject @Right Leg rightLeg;
>
> Now you can't do
>
> bind(Foot.class).to(new Foot("Lefty")).ifParentAnnotatedWith
> (Left.class);
> bind(Foot.class).to(new Foot("Righty")).ifParentAnnotatedWith
> (Right.class);
>
> but notice how with Private Module you can get this functionality.
>
> I've been playing around with this and made an example using a Car
> maybe that will be clearer. I get confused with Feet and Leg on first
> reading.
>
> Cheers,
> Alen
>
> /////////////////////////////////////////////////////////////////////////////////
> import com.google.inject.*;
> import com.google.inject.privatemodules.PrivateModule;
>
> import static java.lang.annotation.ElementType.*;
> import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
> import java.util.Date;
>
> public class RobotLegsProblem2 {
>
>
> public static void main(String[] args) {
> Injector injector = Guice.createInjector(new AbstractModule()
> {
> @Override
> protected void configure() {
> // global stuff
> // same to all
> bind(Driveline.class).to(FrontWheelDrive.class);
> bind(Engine.class).to(DieselEngine.class);
> }
> }, new PrivateModule() {
> @Override
> protected void configurePrivateBindings() {
> // private Module is different story
> // Bind car annotated with blue and expose it
> bind(Car.class).annotatedWith(Blue.class).to
> (Car.class);
> expose(Car.class).annotatedWith(Blue.class);
>
> // What we bind in here only applies to the exposed
> stuff
> // i.e. the exposed car from this module will get this
> injected
> // where stuff in regular module (Engine,Driveline) is
> "inherited" - it is global
> bind(Transmission.class).to
> (AutomaticTransmission.class);
> }
> }, new PrivateModule() {
> @Override
> protected void configurePrivateBindings() {
> bind(Car.class).annotatedWith(Red.class).to
> (Car.class);
> expose(Car.class).annotatedWith(Red.class);
>
> bind(Transmission.class).to(ManualTransmission.class);
> // The point is that you cannot do this with regular
> module i.e.
> // bind(Car.class).annotatedWith(Blue.class).to
> (Car.class);
> // bind(Car.class).annotatedWith(Red.class).to
> (Car.class);
> // now notice the dilemma
> // class Car{
> // @Inject Transmission transmission;
> // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> // You cannot solve this by
> // @Inject @Blue @Red Transmission transmission;
> // or
> // bind(Transmission.class).to
> (AutomaticTransmission.class).ifParentAnnotatedWith(Blue.class)
> // bind(Transmission.class).to
> (ManualTransmission.class).ifParentAnnotatedWith(Red.class)
> // but with private modules you can get this
> functionality
> }
> });
>
> Car blueCar = injector.getInstance(Key.get(Car.class,
> Blue.class));
> System.out.println("Blue car transmission: " +
> blueCar.getTransmission());
>
> Car redCar = injector.getInstance(Key.get(Car.class,
> Red.class));
> System.out.println("Red car transmission: " +
> redCar.getTransmission());
>
> }
>
>
> }
>
> @Retention(RetentionPolicy.RUNTIME)
> @Target({FIELD, PARAMETER, METHOD})
> @BindingAnnotation
> @interface Blue {
> }
>
> @Retention(RetentionPolicy.RUNTIME)
> @Target({FIELD, PARAMETER, METHOD})
> @BindingAnnotation
> @interface Red {
> }
>
> class Car {
>
> private final Engine engine;
> private final Transmission transmission;
> private final Driveline driveline;
>
> @Inject
> public Car(Engine engine, Transmission transmission, Driveline
> driveline) {
> this.engine = engine;
> this.transmission = transmission;
> this.driveline = driveline;;
> }
>
> public Driveline getDriveline() {
> return driveline;
> }
>
> public Engine getEngine() {
> return engine;
> }
>
> public Transmission getTransmission() {
> return transmission;
> }
> }
>
>
> interface Transmission {
> }
>
> class AutomaticTransmission implements Transmission {
> }
>
> class ManualTransmission implements Transmission {
> }
>
> interface Engine {
> }
>
> class DieselEngine implements Engine {
> }
>
> class PetrolEngine implements Engine {
> }
>
> interface Driveline {
> }
>
> class FourWheelDrive implements Driveline {
> }
>
> class FrontWheelDrive implements Driveline {
> }
>
> class RearWheelDrive implements Driveline {
> }
>
>
>
> On Jan 22, 1:45 pm, Anthony MULLER <[email protected]> wrote:
>> Can you explain me what is the case known as "robot legs problem" ?
>>
>> I read FAQ and example here
>> :http://docs.google.com/View?docid=dhfm3hw2_51d2tmv6pc
>>
>> Basically, I don't see why not to write simply this :
>>
>> public class LegModule extends AbstractModule {
>>
>> void configure () {
>> bind(Foot.class).annotatedWith(Left.class).toInstance(new
>> Foot(
>> "leftie"));
>> bind(Foot.class).annotatedWith(Right.class).toInstance(new
>> Foot(
>> "righty"));
>> }
>>
>> }
>>
>> Note : gmail coding...
>>
>> Thanks !
>> Anthony
> >
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-guice?hl=en
-~----------~----~----~----~------~----~------~--~---