2009-03-26 22 views
31

¿Qué opina del uso de métodos estáticos privados?Uso de métodos estáticos privados

Personalmente, yo prefiero usar un método privado estática a no estático con tal de que no requiere ningún acceso a campos de instancia.

Pero escuché que esta práctica viola los principios de OOP.

Editar: Me pregunto por el estilo prospectivo de la vista, no por el rendimiento.

+0

Gracias. No pudo encontrarlo –

Respuesta

34

Un método private static por sí mismo no viola el OOP per se, pero cuando tiene muchos de estos métodos en una clase que no necesita (y no puede *) acceder a campos de instancia, no está programando de manera OO , porque "objeto" implica estado + operaciones en ese estado definidas juntas. ¿Por qué estás poniendo estos métodos en esa clase, si no necesitan ningún estado?

(*) = En principio, debido a la visibilidad nivel de clase en Java, un método estático en una clase tiene acceso a campos de instancia de un objeto de esa clase, por ejemplo:

class Test 
{ 
    int field = 123; 

    private static void accessInstance(Test test) 
    { 
    System.out.println(test.field); 
    } 
} 

Por supuesto, debe pasar la referencia a una instancia (puntero this), pero entonces esencialmente está imitando métodos de instancia. Solo menciono esto para completarlo.

+0

Buenos puntos. Un contra-argumento para incluir métodos estáticos sería para la cohesión, pero si tiene demasiados podría indicar que la clase ha superado sus intenciones. –

2

No veo necesariamente ningún problema real con lo que está haciendo, pero mi primera pregunta sería si el método no requiere acceso a ningún campo de instancia, entonces, ¿qué está haciendo en esa clase en primer lugar? ?

+0

Esto podría suceder cuando necesito aplicar comprobaciones específicas para los parámetros de entrada en algún método público. Como una especie de pequeño método de ayuda. –

+0

... o cuando se trata de campos estáticos, obviamente = 8-) – Yuval

+0

@Andrey - eso tiene mucho sentido. Como dije, es solo la primera pregunta que me haría si me encuentro haciendo lo mismo. A menudo, esos métodos de "ayuda" pueden ser útiles para otras cosas y se pueden refactorizar mejor en otra clase. Pero entonces, a veces no son demasiado :) –

0

Es una cuestión de gusto, pero hago métodos que no reaccionan a un estado dentro del objeto estático. De esta forma, no es necesario volver a escribir el código si una función estática necesita una funcionalidad similar. Una función de clasificación sería un buen ejemplo de tal caso.

3

privado o público no hace la diferencia - los métodos estáticos son correctos, pero si encuentra que los está usando todo el tiempo (y por supuesto los métodos de instancia que no acceden a ningún campo de instancia son básicamente métodos estáticos para este propósito), entonces probablemente necesites replantear el diseño. No siempre es posible, pero la mayoría de los métodos deberían residir con los datos en los que operan, esa es la idea básica de OOP.

0

Tiendo a no utilizar métodos estáticos privados. Utilizo métodos públicos estáticos y los agrupo en clases de Util para promover la reutilización.

+1

¿Y qué hace con los métodos que son demasiado específicos para compartir? Para la funcionalidad general, también extraigo métodos para clases de utilidad. –

+1

Urgh. No agrupe los métodos al azar. –

0

Los métodos estáticos privados pueden funcionar, por ejemplo, en miembros estáticos privados de su clase. Esto se puede utilizar para encapsular y unificar ciertas operaciones específicas de clase.

El principal inconveniente de utilizar métodos estáticos es, en mi opinión, el hecho de que uno descarta la posibilidad de anular. Dado que las clases en Java no son, digamos, clases en Smalltalk, no puede anular los métodos estáticos.

Dado que su pregunta se refiere a métodos estáticos privados, la anulación está fuera de la opción de todos modos.

Tiendo a utilizar métodos estáticos solo en el caso de clases de utilidad (como java.lang.Math) o patrones como el patrón de Singleton. Todos estos requieren una mayor visibilidad que la privacidad, ya que representan los servicios proporcionados por su clase a los demás.

Pensamiento final: Si tiene uno o más métodos privados estáticos, piense en extraerlos a una clase de utilidad dedicada y hacerlos públicos. Mejor aún, conviértelos en métodos de instancia y use el patrón de Singleton.

19

Como se mencionó anteriormente, los métodos estáticos privados suelen ser útiles para organizar la lógica reutilizada y reducir/eliminar código repetido. Me sorprende que no haya notado ninguna mención de rendimiento en esta discusión. De Renaud Waldura de 'la última palabra sobre Final:

(Nota, los métodos estáticos privados son implícitamente final)

"Desde un método final sólo se implementa en la clase que se declara, no hay necesidad de enviar dinámicamente una llamar a un método final, y la invocación estática se puede usar en su lugar. El compilador puede emitir una llamada directa al método, evitando por completo el procedimiento de invocación de método virtual habitual. Debido a esto, los métodos finales también son candidatos para alinearse por un Just-In - Compilador de tiempo o una herramienta de optimización similar. (Recuerde, los métodos privados/estáticos ya son definitivos, por lo tanto, siempre se tienen en cuenta para esta optimización.) "

Vea t El documento completo: http://renaud.waldura.com/doc/java/final-keyword.shtml

Cuestiones relacionadas