Uma regra prática: pergunte a si mesmo "Faz sentido chamar esse método, mesmo que nenhum objeto tenha sido construído ainda?" Nesse caso, deve ser definitivamente estático.
Portanto, em uma classe, Car
você pode ter um método:
double convertMpgToKpl(double mpg)
... o que seria estático, porque é possível saber no que 35mpg se converte, mesmo que ninguém jamais tenha construído um Car
. Mas este método (que define a eficiência de um particular Car
):
void setMileage(double mpg)
... não pode ser estático, pois é inconcebível chamar o método antes que qualquer Car
tenha sido construído.
(A propósito, o inverso nem sempre é verdadeiro: às vezes você pode ter um método que envolve dois Car
objetos e ainda assim querer que seja estático. Por exemplo:
Car theMoreEfficientOf( Car c1, Car c2 )
Embora isso possa ser convertido para uma versão não estática, alguns argumentam que, como não há uma opção "privilegiada", o que Car
é mais importante, você não deve forçar um chamador a escolher um Car
como o objeto que você chamará. método ativado. Essa situação é responsável por uma fração bastante pequena de todos os métodos estáticos.)