Reputation: 305
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