Поместить все файлы в один и тот же объект?
У меня есть следующая иерархия классов:
public enum Bonus{
FP,
PRECOIL,
//some ohter types
};
public interface Generator{
public Object generate();
};
public class DateGenerator implements Generator{
public String queryString;
public Integer order;
//GET, SET
public Date generate(){
//implementation
}
};
public class BonusEnumGenerator implements Generator{
public Date bonusAppliedDate;
public String description;
//GET, SET
public Bonus generate(){
//implementation
}
}
Поэтому мне нужно поместить эти параметры для генерации объектов в обобщенный объект.
Считается ли хорошим, если я создаю класс, скажем GeneratorParams
и помещаю все парамы для всех реализаций Generator
. В моем конкретном случае я бы имел:
public class GeneratorParams{
public String queryString;
public Integer order;
public Date bonusAppliedDate;
public String description;
}
Что меня раздражает, так это то, что я помещаю парамы, которые не относятся друг к другу, в один и тот же объект. Это хорошо?
почему я хочу поместить все парамы в a один объект?
Beucase я хочу написать более обобщенный код. В этом случае у меня было бы:
public interface Generator{
public Object generate();
public void applyParams(GeneratorParams params);
};
И applyParams
метод будет реализован для каждого типа Generator
.
Так что я мог бы написать что-то вроде этого:
Generator g = GeneratorPrototypeFactory.createGenerator(TypeId typeId);
GeneratorParams p;
//Getting params
g.applyParams(p);
Object generated = g.generate();
Как я могу решить это более подходящим способом?
1 ответ:
Просто сделайте
GeneratorParams
абстрактным классом и переместите любой Общий (вDate
иBonusEnum
генераторе) параметр к этому:public abstract class GeneratorParams { public String commonParam; //GET, SET }
Затем добавьте два подкласса:
public class DateGeneratorParams extends GeneratorParams { public String queryString; public Integer order; // GET, SET } public class BonusEnumGeneratorParams implements GeneratorParams { public Date bonusAppliedDate; public String description; // GET, SET }
Теперь реализуем соответствующие
applyParam
вDateGenerator
иBonusEnumGenerator
:public class DateGenerator implements Generator { public String queryString; public Integer order; //GET, SET public Date generate(){ //implementation } @Override public void applyParams(GeneratorParams params) throws InvalidParamException { if(!(params instanceof DateGeneratorParams)) throw new InvalidParamException(); else // assign values } }
И
public class BonusEnumGenerator implements Generator { public Date bonusAppliedDate; public String description; //GET, SET public Bonus generate() { //implementation } public void applyParams(GeneratorParams params) throws InvalidParamException { if(!(params instanceof BonusEnumGeneratorParams)) throw new InvalidParamException(); else // assign values } }