una - public static java
Usar métodos estáticos privados (7)
Como se mencionó anteriormente, los métodos estáticos privados a menudo son útiles para organizar la lógica reutilizada y reducir / eliminar el código repetido. Me sorprende que no haya notado ninguna mención de rendimiento en esta discusión. De ''La última palabra en la final'' de Renaud Waldura:
(Nota, los métodos estáticos privados son implícitamente finales)
"Dado que un método final solo se implementa en la clase de declaración, no hay necesidad de enviar dinámicamente una llamada a un método final, y en su lugar se puede usar la invocación estática. El compilador puede emitir una llamada directa al método, evitando por completo el habitual procedimiento de invocación de método virtual Debido a esto, los métodos finales también son candidatos para alinearse mediante un compilador Just-In-Time o una herramienta de optimización similar. (Recuerde, los métodos privados / estáticos ya son definitivos, por lo tanto, siempre se consideran para esta optimización).
Consulte el documento completo: http://renaud.waldura.com/doc/java/final-keyword.shtml
Esta pregunta ya tiene una respuesta aquí:
¿Qué piensas sobre el uso de métodos estáticos privados ?
Personalmente, prefiero usar un método privado estático a no estático siempre que no requiera acceso a ningún campo 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.
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.
Los métodos estáticos privados pueden, por ejemplo, funcionar 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 relaciona con métodos estáticos privados, la anulación está fuera de la opción de todos modos.
Tiendo a usar 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.
No necesariamente veo ningún problema real con lo que estás 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?
Tiendo a no usar métodos privados estáticos. Utilizo métodos públicos estáticos y los agrupo en clases de Util para promover la reutilización.
privado o público no hace la diferencia: los métodos estáticos son correctos, pero si los usa constantemente (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 fin), 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.
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 del 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 ( this
puntero), pero luego está esencialmente imitando los métodos de instancia. Solo menciono esto para completarlo.