Как избежать получения / установки в классах со многими переменными экземпляра
Я постараюсь быть коротким.
У меня есть классы со многими переменными экземпляра (30+) и, следовательно, много получателей / установщиков. Сами по себе классы просты, но из-за геттеров / сеттеров LOC просто взорвался (а также было слишком много двуязычия кода).
Поэтому я удалил атрибуты и сохранил их на карте, как это
public class MyTechnicalToolClassX
{
//...constructor
private Map data;
public Object getAttributeByKey(AttributeKey key)
{
// ...doStuff, check data associated with key, etc
// if (predicate == true) return otherData;
return data.get(key.toString());
}
public void setAttributeByKey(AttributeKey key, Object value) throws IllegalArgumentException
{
if(key.getType().isInstance(value))
{
data.put(key.toString(), value);
}
else
{
throw IllegalArgumentException("The passed value has the wrong type, we expect: "
+ key.getType().getName());
}
}
public enum AttributeKey
{
someKey1("key1", String.class),
someKey2("key2", Date.class),
//...
someKeyN("keyN", SomeType.class);
private String key;
private Class valueType;
AttributeKey(String key, Class valueType)
{
this.key = key;
this.valueType = valueType;
}
@Override
public String toString()
{
return key;
}
public Class getType()
{
return valueType;
}
} // AttributeKey
} // MyTechnicalToolClassX
AttributeKey раньше был просто строкой, но таким образом я могу обеспечить безопасность типов в установщике. Теперь мой вопрос: я удалил дублирование кода внутри класса, но у меня есть другие классы, которые также имеют много атрибутов (потому что они представляют некоторые технические объекты ...), какой здесь лучший подход? Чтобы дать каждому классу свое собственное перечисление AttributeKey?
РЕШЕНИЕ
Я добавил еще несколько мыслей. У меня есть безопасность типов сейчас во время компиляции. Вот мой новый интерфейс для получения и установки.
public void setAttributeByName(IAttribute attribute, SetVal value);
public Type getAttributeByName(IAttribute attribute);
Джошуа Блох называет такую концепциютипобезопасный гетерогенный контейнер.