Я бы предпочел не использовать карту напрямую. То, что вы ищете, вероятно, является чем-то более специфичным для приложения:
Предположим, что все, что вы создаете, предназначено для нескольких настроек. Ваша «Настройка» будет иметь предопределенный набор ключей. Каждый ключ предопределен, чтобы принять соответствующее значение настройки определенного значения. Если указан неправильный тип, будет сгенерировано исключение.
Я думаю, что примерно так разумно:
enum SettingValueType {
public boolean isCorrectType(Object obj) {
return true if obj is correct type represented by this enum
}
STRING, INT, FLOAT // add support to other type if u want
};
clsss SettingValue {
SettingValueType type;
Object value;
}
class SettingRepo { // a repository of setting entries
private Map<String, SettingValueType> allowedKeyAndType;
private Map<String, Object> settings;
SettingRepo() {
// setup allowedKeyAndType programmatically or from config etc, depends on your design
}
public SettingValue setSetting(String key, Object value) {
SettingValueType valueType = allowedKeyAndType.get(key);
if (valueType == null) {
throw new KeyNotAllowedException();
}
if (v!alueType.isCorrectType(value) {
throw new ValueIncorectTypeException();
}
return settings.put(key, new SettingValue(valueType, value));
}
}
public SettingValue getSetting(String key) {
// u may throw exception if key is not in predefined set
return settings.get(key);
}
// u may consider adding some convinient methods too:
public String setStringSetting(String key, String value) {
if alllowedKeyAndType do not contains key {
throw KeyNOtAllowedException
}
if type is not STRING {
throw IncorrectTypeExceptin
}
settings.put(key, new SettingValue(STRING, value))
}
public String getStringSetting(String key) {
// should be straight forward now, right?
}
}
Есть много мест, которые можно улучшить в зависимости от вашего использования:
если ваши типы очень динамичны, вы можете сделать SettingValueType чем-то вроде набора стратегий или использовать Class напрямую. setSetting () можно сделать универсальным и использовать Class в качестве дополнительного параметра и т. д. Но, по крайней мере, это должно дать вам отправную точку.