Поместить все файлы в один и тот же объект?


У меня есть следующая иерархия классов:

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 3

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
    }    
}