¿Cuándo un método debe ser estático?

Además, ¿hay alguna ventaja de rendimiento para los métodos estáticos sobre los métodos de instancia?

Me encontré con lo siguiente recientemente: http://www.cafeaulait.org/course/week4/22.html :

¿Cuándo un método debe ser estático?

  1. Ni lee ni escribe en los campos de instancia
  2. Independiente del estado del objeto
  3. Métodos matemáticos que aceptan argumentos, aplican un algoritmo a esos argumentos y devuelven un valor
  4. Métodos de fábrica que sirven en lugar de constructores

Estaría muy interesado en los comentarios de la comunidad de Stack Overflow sobre esto.

Haga los métodos estáticos cuando no sean parte de la instancia. No te preocupes por las micro-optimizaciones.

Puede encontrar que tiene muchos métodos privados que pueden ser estáticos pero siempre llama desde métodos de instancia (o entre ellos). En ese caso, realmente no importa mucho. Sin embargo, si quiere realmente poder probar su código, y quizás usarlo desde otro lugar, puede considerar hacer esos métodos estáticos en una clase diferente, no instanciable.

Si un método es estático o no es más una consideración de diseño que una de eficiencia. Un método estático pertenece a una clase, donde un método no estático pertenece a un objeto. Si tuviste una clase de Matemáticas, podrías tener algunos métodos estáticos para tratar con la sum y la resta, porque estos son conceptos asociados con Matemáticas. Sin embargo, si tuviera una clase de automóvil, podría tener algunos métodos no estáticos para cambiar de marcha y dirección, porque están asociados con un automóvil específico, y no con el concepto de autos en general.

Otro problema con los métodos estáticos es que es bastante doloroso escribir pruebas unitarias para ellos, al menos en Java. No puedes burlarte de un método estático de ninguna manera. Hay una publicación en el blog de pruebas de Google sobre este tema .

Mi regla general es escribir métodos estáticos solo cuando no tienen dependencias externas (como acceso a la base de datos, leer archivos, correos electrónicos, etc.) para mantenerlos lo más simples posible.

@jagmal Creo que tienes algunos cables cruzados en alguna parte; todos los ejemplos que mencionas claramente no son métodos estáticos.

Los métodos estáticos deberían tratar completamente con las propiedades abstractas y los conceptos de una clase; no deberían relacionarse de ninguna manera con los atributos específicos de la instancia (y la mayoría de los comstackdores gritarán si lo hacen).

Para el ejemplo del coche, la velocidad, los kms manejados están claramente relacionados con los atributos. El cambio de marchas y el cálculo de velocidad, cuando se consideran a nivel de coche, dependen del atributo, pero considere una clase carModel que hereda del coche: en este punto podrían convertirse en métodos estáticos, ya que los atributos necesarios (como el diámetro de rueda) podrían definirse como constantes en ese nivel.

Solo recuerde que cada vez que escribe un método estático, está escribiendo un método inflexible que no puede modificar su comportamiento muy fácilmente.

Está escribiendo código de procedimiento, por lo que si tiene sentido ser procesal, hágalo. Si no, probablemente debería ser un método de instancia.

Esta idea está tomada de un artículo de Steve Yegge , que creo que es una lectura interesante y útil.

En lo que respecta al rendimiento, un método estático de C ++ puede ser un poco más rápido que un método de instancia no virtual, ya que no es necesario pasar un puntero ‘this’ al método. A su vez, ambos serán más rápidos que los métodos virtuales ya que no se necesita una búsqueda de VMT.

Pero, es probable que esté justo en el ruido, especialmente para los idiomas que permiten optimizar el paso de parámetros innecesarios.

Aquí hay una discusión relacionada con por qué String.Format es estático y resaltará algunas razones.

Otra cosa a considerar al hacer los métodos estáticos es que cualquiera que pueda ver la clase puede llamar a un método estático. Mientras que cuando el mehtod es un método de instancia, solo aquellos que tienen acceso a una instancia pueden llamar a ese método.