Typed Config Wrappers
Raw key strings scattered across the codebase are fragile and hard to maintain. AbstractConfig lets you wrap a Config file in a strongly-typed class that centralizes key strings and defaults in one place.
AbstractConfig
Section titled βAbstractConfigβpublic abstract class AbstractConfig { protected AbstractConfig(Plugin plugin, String fileName) { ... }
public Config raw() // access the underlying Config public void reload() // reload from disk public void save() // persist changes to disk}Creating a typed config
Section titled βCreating a typed configβCreate a final class that extends AbstractConfig and exposes intent-revealing getters:
public final class SettingsConfig extends AbstractConfig {
public SettingsConfig(Plugin plugin) { super(plugin, "config.yml"); }
public String prefix() { return raw().getString("prefix", "<gray>[Core]</gray> "); }
public boolean debug() { return raw().getBoolean("debug", false); }
public int startingBalance() { return raw().getInt("economy.starting-balance", 100); }}Registering with ConfigManager
Section titled βRegistering with ConfigManagerβRegister the wrapper so it participates in hot-reload:
ConfigManager configs = service(ConfigManager.class);SettingsConfig settings = configs.register(new SettingsConfig(plugin));// or provide it as its own service:provide(SettingsConfig.class, settings);Using a typed config
Section titled βUsing a typed configβSettingsConfig settings = configs.get(SettingsConfig.class);String prefix = settings.prefix();boolean isDebug = settings.debug();Benefits
Section titled βBenefitsβ| Approach | Problem |
|---|---|
config.getString("economy.starting-balance") |
Typos compile silently; no IDE autocomplete for key names |
settings.startingBalance() |
Type-safe, refactorable, default in one place |
Multiple config files
Section titled βMultiple config filesβEach YAML file gets its own typed class:
public final class DatabaseConfig extends AbstractConfig { public DatabaseConfig(Plugin plugin) { super(plugin, "database.yml"); } public boolean enabled() { return raw().getBoolean("enabled", false); } public String host() { return raw().getString("host", "localhost"); }}
public final class ArenaConfig extends AbstractConfig { public ArenaConfig(Plugin plugin) { super(plugin, "arenas.yml"); } public List<String> arenaNames() { return raw().getStringList("arenas"); }}