Como evitar getters / setters em classes com muitas variáveis ​​de instância

Vou tentar resumir.

Eu tenho classes com muitas variáveis ​​de instância (30 +) e, portanto, muitos getters / setters. As classes por si só são simples, mas por causa dos getters / setters o LOC explodiu (e também havia muita duplicidade de código).

Então eu removi os atributos e os armazenei em um mapa, como este

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 costumava ser apenas uma string, mas dessa forma eu posso garantir a segurança do tipo no setter. Agora, minha pergunta, eu removi a duplicidade do código dentro da classe, mas eu tenho outras classes que também têm muitos atributos (porque eles representam alguns objetos técnicos ...), qual é a melhor abordagem aqui? Para dar a cada classe seu próprio enlace AttributeKey?

SOLUÇÃO

Eu adicionei mais alguns pensamentos. Eu tenho segurança de tipo agora em tempo de compilação. Aqui está minha nova interface para o getter e setter.

public <Type, SetVal extends Type> void setAttributeByName(IAttribute<Key, Type> attribute, SetVal value);

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

Joshua Bloch chama esse tipo de conceitorecipiente heterogêneo typesafe.

questionAnswers(2)

yourAnswerToTheQuestion