ConfigSection или многоэтажные конфиги

fromgate

Administrator
Сегодня я сделал с классом конфиг в Nukkit'е то, что давно хотел.

Во-первых, был создан отдельный класс ConfigSection - он основа на LinkedHashMap (раньше весь конфиг был построен именно на нём), который является основой для построения всего конфигуратора.

Во-вторых, в Config были добавлены конструкторы и методы, позволяющие использовать его без привязки к конкретному файлу. Раньше, чтобы обращаться к конфигурации сохранённой в виде ресурса в jar-файл, приходилось всё равно использовать файл, который создавался автоматические вне зависимости от того нужен он Вам или нет.

Ну и важно: обеспечена полная совместимость с предыдущей версией классов Config и SimpleConfig. Т.е. Ваши плагины продолжат работу без изменений.

Ну а главное для чего это делалось — это значительное упрощение работы с конфигами, которые не имеют однозначно определяемого набора ключей (к примеру, в качестве ключа выступает имя игрока или имя региона и т.п.).

Допустим, что у Вас в config.yml хранятся данные вида:

Code:
players:
  fromgate:
	mana: 100
  bob:
	mana: 10
  john:
	mana: 30
Т.е. элементом конфигурации players является секция с неопределённым набором ключей - "players.<имяИгрока>.mana".
Когда имя игрока известно - проблем получить значение не возникнет. А если нужно просто получить список всех значений?

Вот варианты:
Java:
	public void readPlayersMana(){
		ConfigSection section = this.getConfig().getSections("players");

		//Имена всех игроков можно будет получить так:
		Set<String> names = section.getKeys(false); // имена всех игроков

		// Можно теперь использовать их, чтобы перебирать в цикле.
		names.forEach(player ->{
			int mana = ((ConfigSection) section.get(player)).getInt("mana");
			this.getLogger().info(player+"'s mana is "+mana);
		});

		// А можно поступить ещё проще

		section.entrySet().forEach(entry ->{
			int mana = ((ConfigSection) entry.getValue()).getInt("mana");
			this.getLogger().info(entry.getKey()+"'s mana is "+mana);
		});
	}
Собственно, пример говорит сам за себя.
 
Top