Pergunta

Além disso, há alguma vantagem de desempenho nos métodos estáticos em relação aos métodos de instância?

Me deparei com o seguinte recentemente: http://www.cafeaulait.org/course/week4/22.html :

Quando um método deve ser estático?

  1. Não lê nem grava em campos de instância
  2. Independente do estado do objeto
  3. Métodos matemáticos que aceitam argumentos, aplicam um algoritmo a esses argumentos e retornam um valor
  4. Métodos de fábrica que servem no lugar de construtores

Eu ficaria muito interessado no feedback da comunidade Stack Overflow sobre isso.

Foi útil?

Solução

Torne os métodos estáticos quando não fizerem parte da instância.Não se preocupe com as micro-otimizações.

Você pode descobrir que tem muitos métodos privados que podem ser estáticos, mas você sempre chama de métodos de instância (ou uns dos outros).Nesse caso, isso realmente não importa muito.No entanto, se você quiser realmente testar seu código e talvez usá-lo em outro lugar, considere criar esses métodos estáticos em uma classe diferente e não instanciável.

Outras dicas

Se um método é ou não estático é mais uma consideração de design do que de eficiência.Um método estático pertence a uma classe, enquanto um método não estático pertence a um objeto.Se você tivesse uma aula de matemática, poderia ter alguns métodos estáticos para lidar com adição e subtração porque esses são conceitos associados à matemática.No entanto, se você tivesse uma classe Car, poderia ter alguns métodos não estáticos para mudar de marcha e dirigir, porque eles estão associados a um carro específico, e não ao conceito de carros em geral.

Outro problema com métodos estáticos é que é bastante doloroso escrever testes unitários para eles - em Java, pelo menos.Você não pode zombar de um método estático de forma alguma.Existe um postar no blog de testes do Google sobre esse problema.

Minha regra geral é escrever métodos estáticos somente quando eles não tiverem dependências externas (como acesso ao banco de dados, leitura de arquivos, e-mails e assim por diante) para mantê-los o mais simples possível.

@jagmal Acho que você tem alguns fios cruzados em algum lugar - todos os exemplos listados claramente não são métodos estáticos.

Os métodos estáticos devem lidar inteiramente com propriedades e conceitos abstratos de uma classe - eles não devem de forma alguma se relacionar com atributos específicos da instância (e a maioria dos compiladores gritará se o fizerem).

Para o exemplo do carro, a velocidade e os quilómetros percorridos estão claramente relacionados com os atributos.A mudança de marcha e o cálculo da velocidade, quando considerados no nível do carro, dependem dos atributos - mas considere uma classe carModel que herda de car:neste ponto eles poderiam se tornar métodos estáticos, já que os atributos necessários (como o diâmetro da roda) poderiam ser definidos como constantes nesse nível.

Apenas lembre-se de que sempre que você está escrevendo um método estático, você está escrevendo um método inflexível que não pode ter seu comportamento modificado facilmente.

Você está escrevendo código processual; portanto, se faz sentido ser processual, faça-o.Caso contrário, provavelmente deveria ser um método de instância.

Esta ideia é tirada de um artigo de Steve Yegge, que considero uma leitura interessante e útil.

Em termos de desempenho, um método estático C++ pode ser um pouco mais rápido que um método de instância não virtual, pois não há necessidade de um ponteiro 'this' ser passado para o método.Por sua vez, ambos serão mais rápidos que os métodos virtuais, pois não há necessidade de pesquisa VMT.

Mas é provável que esteja no meio do ruído - especialmente para linguagens que permitem a otimização de passagens desnecessárias de parâmetros.

Aqui está uma discussão relacionada sobre porque String.Format é estático isso irá destacar alguns motivos.

Outra coisa a considerar ao tornar métodos estáticos é que qualquer pessoa capaz de ver a classe poderá chamar um método estático.Considerando que quando o mehtod é um método de instância, somente aqueles que têm acesso a uma instância podem chamar esse método.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top