usar una restricción programacion métodos metodos metodo estáticos estaticos estatico diferencia cuando clase atributos atributo java design oop class-design

java - restricción - ¿Existe una regla general para cuándo codificar un método estático frente a un método de instancia?



public static java (13)

Estoy aprendiendo Java (y OOP) y aunque podría ser irrelevante para donde estoy en este momento, me preguntaba si SO podría compartir algunas trampas comunes o buenas prácticas de diseño.


Mi regla de oro es: si el método realiza algo relacionado con una instancia específica de una clase, independientemente de si necesita usar variables de instancia de clase. Si puede considerar una situación en la que necesite usar un método determinado sin referirse necesariamente a una instancia de la clase, entonces el método definitivamente debe ser estático (clase). Si este método también necesita hacer uso de variables de instancia en ciertos casos, entonces probablemente sea mejor crear un método de instancia separado que llame al método estático y pase las variables de instancia. En cuanto al rendimiento, creo que hay una diferencia insignificante (al menos en .NET, aunque me imagino que sería muy similar para Java).


Básicamente, la regla de oro es si utiliza cualquier dato específico para el objeto, instancia. Entonces Math.max es estático pero BigInteger.bitCount () es instancia. Obviamente se vuelve más complicado como lo hace su modelo de dominio, y hay casos límite, pero la idea general es simple.


En mi humilde opinión, si puede convertirlo en un método estático (sin tener que cambiar su estructura), conviértalo en un método estático. Es más rápido y simple.

Si sabe que va a querer anular el método, le sugiero que escriba una prueba unitaria donde realmente lo hace, por lo que ya no es apropiado hacerlo estático. Si eso suena demasiado trabajo, entonces no lo convierta en un método de instancia.

En general, no debe agregar funcionalidad tan pronto como imagine un uso un día (de esa manera la locura se encuentra), solo debe agregar la funcionalidad que sabe que realmente necesita.

Para una explicación más larga ...

http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It

http://c2.com/xp/YouArentGonnaNeedIt.html


No creo que ninguna de las respuestas llegue al corazón de la razón OO de cuándo elegir una u otra. Claro, use un método de instancia cuando necesite tratar con miembros de la instancia, pero podría hacer que todos sus miembros sean públicos y luego codificar un método estático que tome como argumento una instancia de la clase. Hola C.

Debe pensar en los mensajes a los que responde el objeto al que está diseñando. Esos siempre serán sus métodos de instancia. Si piensas en tus objetos de esta manera, casi nunca tendrás métodos estáticos . Los miembros estáticos están bien en ciertas circunstancias.

Excepciones notables que vienen a la mente son los patrones Factory Method y Singleton (use sparingly). Tenga cuidado cuando esté tentado de escribir una clase de "ayuda", ya que a partir de ahí, es una pendiente resbaladiza en la programación de procedimientos.


Si conserva el estado (un valor) de un objeto y el método se usa para acceder o modificar el estado, entonces debe usar un método de instancia.

Incluso si el método no altera el estado (una función de utilidad), le recomendaría que use un método de instancia. Principalmente porque de esta manera puede tener una subclase que realice una acción diferente.

Por lo demás, podrías usar un método estático.

:)


Si la implementación de un método se puede expresar completamente en términos de la interfaz pública (sin downcasting) de su clase, entonces puede ser un buen candidato para un método de "utilidad" estático. Esto le permite mantener una interfaz mínima al tiempo que proporciona los métodos de conveniencia que los clientes del código pueden usar mucho. Como explica Scott Meyers , este enfoque fomenta la encapsulación minimizando la cantidad de código afectado por un cambio en la implementación interna de una clase. Aquí hay otro artículo interesante de Herb Sutter destacando std :: basic_string, decidiendo qué métodos deberían ser miembros y qué no.

En un lenguaje como Java o C ++, admitiré que los métodos estáticos hacen que el código sea menos elegante por lo que todavía hay una compensación. En C #, los métodos de extensión pueden darte lo mejor de ambos mundos.

Si la operación necesita ser reemplazada por una subclase por alguna razón, entonces, por supuesto, debe ser un método de instancia, en cuyo caso tendrá que pensar en todos los factores que intervienen en el diseño de una clase para la herencia.


Si usa una variable de instancia, debe ser un método de instancia.

De lo contrario, depende de usted, pero si se encuentra con muchos métodos estáticos y / o variables estáticas no finales, probablemente desee extraer todo el material estático en una nueva instancia de clase. (Un grupo de métodos y miembros estáticos es un singleton, pero realmente molesto, tener un objeto singleton real sería mejor, ¡un objeto común que resulta ser uno de los mejores!).


Su elección predeterminada debe ser un método de instancia.


Una cosa importante para recordar es que los métodos estáticos no pueden ser anulados por una subclase. Las referencias a un método estático en su código esencialmente lo vinculan a esa implementación. Al usar métodos de instancia, el comportamiento puede variar según el tipo de instancia. Puede aprovechar el polimorfismo. Los métodos estáticos son más adecuados para los tipos de operaciones utilitarias donde el comportamiento es inamovible. Cosas como la codificación de base 64 o el cálculo de una suma de comprobación, por ejemplo.


Usaría un método de instancia por defecto. La ventaja es que el comportamiento puede ser anulado en una subclase o si está codificando contra interfaces, se puede usar una implementación alternativa del colaborador. Esto es realmente útil para la flexibilidad en el código de prueba.

Las referencias estáticas se integran en su implementación y no pueden cambiar. Encuentro estático útil para métodos de utilidad cortos. Si el contenido de su método estático es muy extenso, le conviene pensar en dividir la responsabilidad en uno o más objetos separados y permitir que colaboren con el código del cliente como instancias de objetos.


el problema con los métodos estáticos es que estás rompiendo uno de los principios centrales orientados a objetos a medida que te unes a una implementación. Desea apoyar el principio de cierre abierto y haga que su clase implemente una interfaz que describa la dependencia (en un sentido abstracto de comportamiento) y luego haga que sus clases dependan de esa interfaz. Mucho más fácil de extender después de ese punto en el futuro. ..


Mis métodos estáticos son siempre uno de los siguientes:

  1. Métodos privados de "ayuda" que evalúan una fórmula útil solo para esa clase.
  2. Métodos de fábrica ( Foo.getInstance() etc.)
  3. En una clase de "utilidad" que es definitiva, tiene un constructor privado y no contiene nada más que métodos públicos estáticos (por ejemplo, com.google.common.collect.Maps )

No estableceré un método estático simplemente porque no se refiera a ninguna variable de instancia.