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.