Я работаю над небольшим проектом игры в пинбол для хобби и ищу шаблон для инкапсуляции постоянных переменных.
У меня есть модель, в которой есть значения, которые будут постоянными в течение срока службы этой модели, например. максимальная скорость / максимальная сила тяжести и т. д. Во всех графических интерфейсах и других областях эти значения необходимы для правильной проверки ввода. В настоящее время они включены либо как ссылки на public static final
, либо просто жестко запрограммированы. Я хотел бы инкапсулировать эти «постоянные переменные» в объект, который может быть введен в модель и получен с помощью view / controller.
Чтобы уточнить, значение «постоянных переменных» не обязательно может быть определено во время компиляции, они могут быть получены при чтении в файле; пользовательский ввод и т. д. То, что известно во время компиляции, это , которые необходимы . Способ, который может быть проще объяснить, состоит в том, что, какой бы ни была эта инкапсуляция, значения, которые она предоставляет, являются неизменными .
Я ищу способ достичь этого, который:
- имеет безопасность типов времени компиляции (т.е. не отображает строку в переменную во время выполнения)
- избегает чего-либо статического (включая перечисления, которые не могут быть расширены)
Я знаю, что мог бы определить интерфейс, который имеет такие методы, как:
public int getMaximumSpeed();
public int getMaximumGravity();
... и внедрить экземпляр этого в модель и каким-то образом сделать его доступным. Однако это приводит к большому количеству шаблонного кода, который довольно утомительно писать / тестировать и т. Д. (Я делаю это для забавы: -)).
Я ищу лучший способ сделать это, предпочтительно тот, который имеет преимущества от того, чтобы быть частью общего словаря, как с шаблонами проектирования.
Есть ли лучший способ сделать это?
P.S. Я подумал еще немного об этом, и лучший компромисс, который я мог бы найти, это иметь что-то вроде:
public class Variables {
enum Variable {
MaxSpeed(100),
MaxGravity(10)
Variable(Object variableValue) {
// assign value to field, provide getter etc.
}
}
public Object getVariable(Variable v) { // look up enum and get member }
} // end of MyVariables
Тогда я мог бы сделать что-то вроде:
Model m = new Model(new Variables());
Преимущества : поиск переменной защищен необходимостью быть членом перечисления для компиляции, переменные могут быть добавлены с небольшим дополнительным кодом
Недостатки : перечисления не могут быть расширены, хрупкость (необходима перекомпиляция для добавления переменной), значения переменных должны быть преобразованы из Object (в Integer в этом примере), что опять-таки не является безопасным для типа хотя дженерики могут быть вариантом для этого ... как-то