Как избежать получения / установки в классах со многими переменными экземпляра

Я постараюсь быть коротким.

У меня есть классы со многими переменными экземпляра (30+) и, следовательно, много получателей / установщиков. Сами по себе классы просты, но из-за геттеров / сеттеров LOC просто взорвался (а также было слишком много двуязычия кода).

Поэтому я удалил атрибуты и сохранил их на карте, как это

public class MyTechnicalToolClassX
{

//...constructor

private Map<String, Object> 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 <Type, SetVal extends Type> void setAttributeByName(IAttribute<Key, Type> attribute, SetVal value);

public <Type> Type getAttributeByName(IAttribute<Key, Type> attribute);

Джошуа Блох называет такую концепциютипобезопасный гетерогенный контейнер.

Ответы на вопрос(2)

Ваш ответ на вопрос