2011-09-14 11 views
6

Actualmente estoy interesado en el marco de juego porque este marco promete un desarrollo más rápido.¿Hay algún efecto secundario de usar muchas funciones estáticas?

Cuando veo el código, hay tantos códigos estáticos. incluso el controlador declarado como función estática. Por lo tanto, todo el código que llama dentro de la función estática debe ser estático, ¿verdad?

Mi pregunta es, ¿este enfoque es correcto? ¿Hay algún efecto secundario de usar para muchas funciones estáticas?

+0

métodos estáticos pueden llamar a métodos de instancia no estáticos que se pasan como argumentos o en campos estáticos, u objetos que crean. No puede llamar al método no estático de la misma clase sin una instancia. –

+0

@ Peter: ¿Podría elaborar más, por favor – indrap

Respuesta

7

Un par de cosas sobre los métodos estáticos en un lenguaje orientado a objetos: Déjame intentar explicar los problemas si eliges tener todos los métodos estáticos.

El uso de todas las funciones estáticas puede no ser idiomático en un lenguaje orientado a objetos. No puede anular funciones estáticas en una subclase. Por lo tanto, usted pierde la capacidad de hacer polimorfismo en tiempo de ejecución anulando.

Las variables que defina se convertirán todas en variables de clase automáticamente (ya que todos sus métodos son estáticos), por lo que esencialmente no tiene ningún estado asociado a la instancia.

Los métodos estáticos son difíciles de simular. Es posible que necesite marcos como PowerMock para burlarse de usted. Entonces las pruebas se vuelven difíciles.

El diseño se vuelve un poco complejo ya que no podrá crear clases inmutables ya que solo tiene la clase y no tiene ninguna instancia. Así que diseñar clases seguras para subprocesos se vuelve difícil.

+0

Para la prueba, Play Framework use JUNIT4 y Selenium.Creo que es suficiente para crear pruebas unitarias y pruebas de regresión – indrap

+0

"Entonces, el diseño de clases seguras para subprocesos se vuelve difícil" según su comentario, ¿no es bueno usar el marco de juego en la aplicación empresarial? – indrap

+0

Déjenme aclarar. Diseñar una clase para la inmutabilidad es una forma de diseñar una clase segura para subprocesos sin tener que introducir sincronización. Por supuesto, cuando necesita un cambio de estado para el objeto, entonces debe crear una nueva instancia de la clase. Para un ejemplo, mira la clase String. Pero si tus métodos son todos estáticos y todo lo que tienes son variables de clase, entonces una clase inmutable está fuera de cuestión, ya que no hay instancia. No quise decir que una clase con solo métodos estáticos no puede ser segura. – Aneesh

-3

Sí, existe el efecto secundario de utilizar demasiadas funciones estáticas o variables. Debe evitar declaraciones estáticas innecesarias.

Porque los miembros estáticos siempre crean un espacio de memoria una vez que la clase se carga en el JRE. Incluso si no crea el objeto de la clase, ocupará la memoria.

+0

Como el controlador usa la clase estática, todas las funciones o clases que se llaman dentro del controlador deben ser estáticas para ... Creo que en este caso el uso estático es bastante necesario. – indrap

+3

Esta respuesta es incorrecta. Un método estático no usa más ni menos espacio que un método de instancia. Y no importa si se crea o no una instancia de la clase. –

+0

El OP está preguntando sobre _funciones estáticas_, no _campos_ estáticos. Los campos estáticos asignarán espacio tan pronto como se cargue la clase, mientras que los campos de instancia no se asignarán hasta que se cree una instancia (sin embargo, la memoria asignada para un campo estático solo se asigna una vez, pero los campos de instancia asignan memoria adicional para cada instancia). Como señala @stephenc, no hay diferencia para los métodos. – Chadwick

1

Para ampliar mi comentario.

métodos estáticos pueden llamar a métodos no estáticos siempre que tenga una instancia de algo.

class A { 
    public void nonStaticMethod() { } 

    public static void staticMethod(String text) { 
     // calls non-static method on text 
     text.length(); 
     // calls non-static method on new Object 
     new Object().hashCode(); 
     // calls non static method on a instance of A 
     new A().nonStaticMethod(); 
    } 
} 
+1

te veo señalar, gracias. Puedo usar google guice para crear una instancia de objeto y luego usar la función no estática en el controlador – indrap

17

Esta pregunta se ha formulado de forma similar anteriormente. La respuesta simple es que Play usa estadísticas donde es sensato.

El modelo HTTP no es un modelo OO. Las propias solicitudes HTTP son sin estado, y por lo tanto, los métodos estáticos permiten el acceso a los controladores como solicitudes funcionales del código del cliente.

Las clases de modelos, por otro lado, son OO puros, y como resultado no son estáticas pesadas. Algunos de los métodos de utilidad, como findAll o findById son estáticos, pero estos no son statefull, y son métodos de utilidad en la clase. Esperaría esto en un modelo OO estándar de todos modos.

Por lo tanto, no creo que exista ningún riesgo al hacer las cosas de la manera en que Play espera. Puede parecer extraño, porque desafía la norma, pero lo hace por razones de sonido.

+4

Esta es la respuesta correcta, ya que pertenece específicamente a Play Framework. – Ryan

+1

En la página 15 del libro de cocina de Play Framework, se muestra que el creador se ocupó muy bien de este problema, vea (play.classloading. enhancers.ControllerEnhancer) – indrap

+1

De hecho lo hizo. Guillaume es un tipo muy inteligente, y el equipo de Play ha diseñado muy bien la estructura de Play. – Codemwnci

Cuestiones relacionadas