Si todos los métodos que no usan variables de instancia se marcan como estáticos


Supongamos que tengo una clase como esta:

public class Car {

    private double distanceDriven;

    public void drive(double miles){
        distanceDriven += miles;
    }

    public void driveInCanada(double kilometer){
        distanceDriven += convertToMiles(kilometer);
    }

    private double convertToMiles(double km){
        return km*0.621371192;
    }   
}

Puedes ver que convertToMiles es:

  • no usar ninguna variable de instancia
  • solo se usa dentro de la clase

¿Debería ser declarado como estático? Esto no cambia la funcionalidad de la función en absoluto (ver arriba). Creo que puede afectar:

  • legibilidad
  • rendimiento
  • ¿otro?

Si la función convertToMiles se parece a:

    private double convertToMiles(double km){

O

    private static double convertToMiles(double km){
Author: Paul Bellora, 2011-08-29

6 answers

Para la higiene estilística máxima, sí, los métodos privados que no usan ningún estado de objeto, sino que solo tienen sentido dentro del objeto, deben ser estáticos.

Esa es la forma más clara (y estricta) de indicar cómo funcionan, y te obligará a tener cuidado con tu diseño alrededor de los límites de los métodos, y a pensarlo dos veces si decides cambiar uno de ellos más tarde para usar datos de objetos.

FWIW, no sospecho que haya un impacto relevante en el rendimiento aquí (en teoría la estática es más fácil de llamar debido a que no hay referencia implícita this). Además, podría volverse loco siendo estricto con esto en su base de código, pero ciertamente es un objetivo razonable.

N.B. Los métodos públicos requieren más consideración antes de marcarlos estáticos; esos no pueden cambiar en el futuro sin afectar a las personas que llaman, por lo que "incumplir la estanqueidad" no siempre es la opción correcta.

 18
Author: Ben Zotto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-29 19:32:13

Si te estás preguntando esto, tu diseño ya es inestable. Debe extraer todas esas funciones "estáticas" de la clase y ponerlas en una clase estática de contenedor de algoritmo genérico y reutilizable.

Mira tu código, ¿qué tiene que ver convertToMiles con un coche? Es un algoritmo genérico que puede ser reutilizado en múltiples funciones.

 6
Author: Blindy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-29 19:37:33

Usar static podría hacer una diferencia de rendimiento, sin embargo, esto es menos probable si está en línea, ya que no se llamará tanto.

static es útil ya que deja claro que no está accediendo a ningún campo de miembro. Esto ha recogido algunos errores para mí en el pasado cuando marcé un método como estático, pero esto produjo un error (porque no debería haber estado utilizando un campo miembro)

Puedes ser creativo con el diseño y agregar capas y complejidad que podrían ser útiles algún día, pero iría con el principio YANGI y diría que es poco probable que quiera cambiar la forma en que los kilo-metros se convierten en millas, o si lo cambia, es poco probable que desee más de una forma de hacerlo.

 4
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-29 19:31:19

A definitive NO for ALL such methods.

Por ejemplo, es perfectamente legal que tal método calcule un resultado (valor devuelto) solo en sus argumentos, y al autor le gustaría permitir que otros cambien el cálculo en una subclase. (Este es algún tipo de patrón de método de plantilla.) And Y sobreescribir una clase solo se puede hacer si lo son ..ni.. estática.

Por cierto: si cambias tu pregunta y pides solo métodos privados, entonces no podría argumentar de esta manera. Pero pediste todo tipo de métodos.

 4
Author: Ralph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-29 20:21:47

Sí. Utilice métodos estáticos cuando pueda.

 2
Author: Michał Šrajer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-30 16:02:11
private static double convertToMiles(double km){}

Este será el correcto para su código de programa, ya que el método convertToMiles() no tiene nada que ver con la variable de instancia.

Pero tenga en cuenta que este método no es reutilizable en otra clase por miembros no estáticos, si es así, entonces el propósito mismo de static no servirá, ya que static evita la creación de múltiples objetos y el desperdicio de memoria.

 1
Author: Asim Parveez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-25 19:10:54