Um problema aí é que em Operacoes
tudo está static
. Sendo assim, só existe um totalAcc
compartilhado entre todas as instâncias. Por exemplo, e se eu quisesse ter 2 operações diferentes e independentes?
// cria 2 instâncias de Operacoes
Operacoes op = new Operacoes();
Operacoes outraOp = new Operacoes();
// usa uma das operações
op.soma(Arrays.asList(1.0, 2.0));
// o valor de totalAcc da outra é alterado (na verdade é o mesmo, compartilhado entre as duas operações)
System.out.println(outraOp.totalAcc); // 3.0
Então você tem que decidir: deve ser possível ter 2 instâncias de Operacoes
, cada uma com seu total?
Se não deve ser possível ter 2 instâncias diferentes, então nem faz sentido criar uma instância, você poderia usar simplesmente:
total = Operacoes.soma(operandos); // não precisa criar a variável operacoes, nem chamar new Operacoes()
Como os métodos também são estáticos, eles podem ser chamados diretamente através da própria classe. Criar instâncias nesse caso (com new
) não tem nenhum ganho, na verdade nem faria sentido, já que tudo na classe é static
.
Mas se você quer a possibilidade de ter várias instâncias diferentes, cada uma com seu total, então deve remover o static
de tudo:
public class Operacoes {
private Double totalAcc;
public Operacoes() {
this.totalAcc = 0.0;
}
public Double getTotalAcc() { // criar um getter para o campo
return totalAcc;
}
public double soma(List<Double> operandos) {
for (Double valor : operandos) {
totalAcc += valor;
}
return totalAcc;
}
etc... (fazer o mesmo para os outros métodos)
}
Agora sim podemos ter operações independentes, cada uma com seu totalAcc
:
Operacoes op = new Operacoes();
Operacoes outraOp = new Operacoes();
op.soma(Arrays.asList(1.0, 2.0));
// total de uma operação não é mais afetado pela outra
System.out.println(outraOp.getTotalAcc()); // 0.0
Repare também que criei um getter para o campo totalAcc
, mas não criei um setter. Fiz isso porque obter o valor total acumulado faz sentido, mas mudá-lo diretamente não.
Da forma que você havia feito, com o campo public
, era possível fazer isso:
Operacoes.soma(Arrays.asList(1.0, 2.0));
Operacoes.totalAcc = 99999.0; // muda o total para um valor nada a ver
Ou seja, era possível mudar o total para um valor completamente nada a ver. Mantendo o campo private
e só criando um getter, eu controlo melhor quem pode alterá-lo - no caso, somente as operações podem mudar esse valor, evitando esses problemas.