Существует причина, по которой часто используются статические поля, и причина в том, что статические поля менее гибкие, чем нестатические, потому что может быть только одна копия статического поля, но нестатического поляможет содержать разные значения для каждого экземпляра объекта.
Используя статические поля, вы ограничиваете себя только одним игроком.Если вы когда-нибудь захотите сделать многопользовательский режим, вы не сможете - не переписав много чего.
Как обычно это делается, примерно так:
class Player {
String name;
Location loc;
List<Item> inventory;
void pickup() {
if (itemsOnGround.isEmpty()) {
throw new InvalidActionException("There appears to be nothing to pick up here");
}
inventory.add(loc.itemsOnGround.get(0));
loc.itemsOnGround.remove(0);
}
}
class Location {
List<Items> itemsOnGround;
/** null if there isn't a monster here */
Monster monster;
}
class Game {
Player player;
}
class Ui {
Game game;
void keypressed(char key) {
try {
if (key == 'p') {
game.player.pickup();
} else {
showKeyboardHelp();
}
} catch (InvalidActionException e) {
showErrorMessage(e.getMessage());
}
}
}
Как вы можетевидите, не должно быть статического поля.Это позволяет вам переключать игры без перезапуска приложения (просто перезапись всех статических полей может привести к ошибкам - что если вы забудете одно? Должен ли игрок, получивший амулет yendor в предыдущей игре, действительно перенести?), Позволяя при этом создаватьдополнительные предметы, игрок (или персонажи, похожие на игрока, обычно называемые NPC в RPG lingo) на ваше усмотрение, и все же позволяет логически группировать связанные поля в классы, так что вы можете найти их снова, когда вы снова посмотрите на свой код через несколько месяцев.
Если ваша игра становится нетривиальной, вам также следует обратить внимание на инкапсуляцию.Политика, которую я обычно использую в небольших проектах, заключается в том, что поля могут быть записаны только кодом из класса, который их объявляет, но могут считываться по всей программе.В более крупном проекте, особенно если в нем участвуют несколько человек, вы, вероятно, захотите, чтобы компилятор принудительно применил это, сделав поля приватными и получив доступ к их состоянию через открытые методы (часто называемые «получателями»), написанные для этой цели.