Utilities API
Полное руководство по Utilities API: TimeUtil, ConfigUtil, единицы времени, безопасный парсинг и практики предотвращения конфиг-багов.
Utilities API
Utilities API — набор небольших утилит, которые снимают повседневную рутину и уменьшают количество мелких, но неприятных багов.
1. Что входит в модуль
Основные классы:
TimeUtilConfigUtil
Эти утилиты часто используются в cooldown системах, таймерах, конфиг-парсинге, арене/мире и командных параметрах.
2. TimeUtil
parseTime(String input)
Преобразует человекочитаемое время в секунды.
Поддержка форматов:
30-> 3030s-> 305m-> 3002h-> 72001d-> 86400
Пример:
int pvpCooldown = TimeUtil.parseTime("45s");
int dailyReset = TimeUtil.parseTime("24h");
Ошибки
Метод бросает IllegalArgumentException, если:
- input null/blank;
- суффикс неизвестный;
- значение отрицательное.
Это полезно для fail-fast конфигурации.
formatTime(int seconds)
Форматирует секунды в m:ss.
String ui = TimeUtil.formatTime(95); // 1:35
Подходит для:
- lore;
- action bar;
- статуса квеста/кулдауна.
3. ConfigUtil
getWorld(section, path, defaultWorldName)
World world = ConfigUtil.getWorld(config, "arena.world", "world");
Поведение:
- читает строку пути;
- fallback на default;
- пытается найти мир через Bukkit.
Если мир не найден, вернётся null, это нужно обработать явно.
parseTime(section, path, defaultValue)
int delay = ConfigUtil.parseTime(config, "arena.respawnDelay", 30);
Поведение:
- если пути нет -> default;
- если строка есть ->
TimeUtil.parseTime.
4. Практика единиц времени
Одна из частых причин логических багов — смешение секунд и тиков.
Рекомендуемый стандарт:
- в конфиге:
s/m/h/d; - внутри домена: секунды;
- перед Bukkit scheduler: явная конверсия в тики.
long ticks = seconds * 20L;
5. Типовой шаблон конфиг-класса
public final class ArenaConfig extends BaseConfig {
private World arenaWorld;
private int respawnDelaySeconds;
public ArenaConfig(JavaPlugin plugin) {
super(plugin, "arena.yml", true);
reloadConfig();
}
@Override
protected void loadValues() {
arenaWorld = ConfigUtil.getWorld(config, "arena.world", "world");
respawnDelaySeconds = ConfigUtil.parseTime(config, "arena.respawnDelay", 30);
if (arenaWorld == null) {
plugin.getLogger().warning("arena.world points to unknown world");
}
}
}
6. Частые ошибки
- парсить время руками через
Integer.parseIntи потерятьm/h/d; - не проверять
nullworld; - хранить время в разных единицах в разных модулях.
7. Антипаттерны
- магические числа времени по коду;
- вручную повторять одинаковый парсинг в 20 местах;
- default values без явного логирования, когда ключ отсутствует.
8. Рекомендованные практики
- Все временные конфиги через
TimeUtil/ConfigUtil. - Секунды как базовая единица в домене.
- Явный warning при
nullworld или невалидном config path. - Unit тесты на критичные парсеры и boundary значения.
9. FAQ
Можно ли расширить TimeUtil новыми суффиксами?
Да, но желательно централизованно и с тестами, чтобы не сломать существующие конфиги.
Нужно ли хранить время в миллисекундах?
Только если это действительно требуется точностью логики. Для большинства игровых сценариев секунд достаточно.
Utilities API это «маленький модуль, который экономит много времени» за счёт устранения повторяемого кода и скрытых ошибок парсинга.