Olá, estou com uma dúvida.
tenho uma collection de objetos que possuem o metodo getValue();
Gostaria de fazer uma classe MyCollection que quando eu executar um método ele fizesse a soma dos valores, exemplo :
MyCollection myCollection = facade.getValues();
long total = myCollection.soma();
Minha dúvida está em como fazer a implementação para que o método soma use o metodo getValue dos objetos ?
Se esses tais objetos que têm o método “getValue()” implementarem uma interface que tem o método getValue:
interface IValue {
double getValue();
}
aí é bem mais fácil, e você nem precisa ter uma classe MyCollection. Simplesmente crie um método que pega a tal collection e soma os valores dos objetos que implementam IValue.
public static double soma (Collection coll) {
double ret = 0.0;
for (Iterator it = coll.iterator(); it.hasNext(); ) {
Object obj = it.next();
if (obj instanceof IValue) {
ret += ((IValue)obj).getValue();
}
}
return ret;
}
Se você não pode alterar as classes dos objetos para que implementem a tal interface, então fica muito mais lento, porque você precisa checar objeto por objeto, usando reflection, se ele tem um método chamado getValue, e se ela não tem parâmetros e retorna double. Isso é lento.
Eu acredito que a logica a ser utilizada é essa mesma, porem eu utilizaria os recursos do Java 5 a nosso favor, vejam o código abaixo como é mais limpo e faz praticamente a mesma coisa…
public static double soma (Collection<? extends IValue > coll) {
double ret = 0.0;
for(IValue valor : coll) {
ret += valor;
}
return ret;
}
Lendo em miudos, o metodo some recebe um List de qualquer Objeto que passe no teste instanceOf (É UM) de IValue.
Em seguida utilizamos o for aprimorado para trabalhar com a Collection.
MAs vale lembrar de que isso só funciona se estiver utilizando a versão 5 do Java!!!
Um grande abraço!!