GareGarble
GareGarble

Reputation: 305

Guice getInstance to inject child classes

I have an abstract class and its 2 implementations and trying to avoid injecting the individual classes in the Factory. I would prefer using Guice's Injector.getInstance method instead. But Guice Injector javadocs also says :

When feasible, avoid using this method, in favor of having Guice inject your dependencies ahead of time.

Here is some code reference.

public abstract class BaseEmailBuilder{
    
    public abstract String buildBody();
    public abstract String getDestinationEmail();

}

public class AppleEmailBuilder extends BaseEmailBuilder{

    public abstract String buildBody(){
        return "";
    }
    
    public abstract String getDestinationEmail(){
        return "[email protected]";
    }
    
}

public class OrangeEmailBuilder extends BaseEmailBuilder{
    public abstract String buildBody(){
        return "";
    }
    
    public abstract String getDestinationEmail(){
        return "[email protected]";
    }
    
}

public enum VendorEmailType{
    APPLE("apple"),
    ORANGE("orange");
}
public class VendorEmailBuilderFactory{

    private static final Map<VendorEmailType,
            Class<?extends BaseEmailBuilder>> EMAIL_BUILDER_BY_TYPE
            = new EnumMap<>(VendorEmailType.class);

    static{
        EMAIL_BUILDER_BY_TYPE.put(EMAIL_BUILDER_BY_TYPE.APPLE,
                AppleEmailBuilder.class);
        EMAIL_BUILDER_BY_TYPE.put(EMAIL_BUILDER_BY_TYPE.ORANGE,
                OrangeEmailBuilder.class);
    }

    @Inject
    private Injector injector;

    public BaseThirdPartyPrivacyDeletionEmailBuilder getEmailBuilderForEmailVendorType(
            VendorEmailType type){
        if(!EMAIL_BUILDER_BY_TYPE.containsKey(type)){
            throw new IllegalArgumentException("Could not find email builder for type=" + type);
        }
        return injector.getInstance(EMAIL_BUILDER_BY_TYPE.get(type));
    }

}

In this case, would it be better to inject the conrete class objects and use a switch case like this?

            VendorEmailType type){
                switch(type){
                case APPLE: return apple;
                case ORANGE: return orange; 
                    break;
                default:
                    throw new IllegalStateException("Could not find email builder type=" + type);
        }

    }```

Upvotes: 0

Views: 41

Answers (0)

Related Questions