Ecco due opzioni:
Opzione 1:
enum QuizCategory {
CATEGORY_1(new MyCollection<Question>()
.add(Question.QUESTION_A)
.add(Question.QUESTION_B)
.add...),
CATEGORY_2(new MyCollection<Question>()
.add(Question.QUESTION_B)
.add(Question.QUESTION_C)
.add...),
...
;
public MyCollection<Question> collection;
private QuizCategory(MyCollection<Question> collection) {
this.collection = collection;
}
public Question getRandom() {
return collection.getRandomQuestion();
}
}
Opzione 2:
enum QuizCategory2 {
CATEGORY_1 {
@Override
protected MyCollection<Question> populateWithQuestions() {
return new MyCollection<Question>()
.add(Question.QUESTION_A)
.add(Question.QUESTION_B)
.add...;
}
},
CATEGORY_2 {
@Override
protected MyCollection<Question> populateWithQuestions() {
return new MyCollection<Question>()
.add(Question.QUESTION_B)
.add(Question.QUESTION_C)
.add...;
}
};
public Question getRandom() {
MyCollection<Question> collection = populateWithQuestions();
return collection.getRandomQuestion();
}
protected abstract MyCollection<Question> populateWithQuestions();
}
Ci saranno circa 1000 categorie, ciascuna contenente 10 - 300 domande (100 in media). Generalmente durante l'esecuzione vengono utilizzate solo 10 categorie e 30 domande. Ogni domanda è di per sé una costante enum (con i suoi campi e metodi).
Sto cercando di decidere tra queste due opzioni nel contesto dell'applicazione mobile. Non ho effettuato alcuna misurazione poiché non ho ancora scritto le domande e vorrei raccogliere più informazioni prima di impegnarmi in una o in un'altra opzione. Per quanto ho capito:
(a) L'opzione 1 funzionerà meglio poiché non sarà necessario popolare la raccolta e quindi raccogliere le domande; (b) L'opzione 1 richiede memoria aggiuntiva: 1000 categorie x 100 domande x 4 byte per ogni riferimento = 400 Kb, che non è significativo.
Quindi mi sto appoggiando all'opzione 1, ma mi chiedo se sono corretto nelle mie ipotesi e non mi manca qualcosa di importante? Forse qualcuno ha affrontato un dilemma simile? O forse non importa così tanto?