Tengo una pregunta general ... ¿cuándo debería usar clases estáticas o métodos estáticos? ... Conozco la idea de que se pueden invocar métodos estáticos sin instanciar ... ¿y las clases estáticas solo deberían usarse para métodos estáticos? ... pero ¿hay algún problema de rendimiento también con eso ... y cuándo deberían preferirse a los métodos y clases de la instancia? ... ¿Alguien podría mencionar brevemente cuándo debo optar por usarlos y cuándo debo evitarlos?Cuándo usar clases y métodos estáticos?
Respuesta
Creo que los siguientes dos enlaces ofrecen una respuesta clara para lo que estás buscando. Echar un vistazo a ellos:
Para las clases estáticas:
When to Use Static Classes in C#
Para los métodos estáticos:
When is it appropriate to use static methods? (Jon Skeet [Guru] respondió éste: o))
Hay es una entrada anterior aquí parece: When to use static classes in C#
Yo would t Las clases estáticas de Hink son para retener funciones o datos que desea llamar sin tener que crear un objeto para ello. Si no recuerdo mal, la instancia de un objeto lo coloca en la memoria. Y, por implicación, ¿una clase estática no objeto no entra en la memoria? Hace un tiempo desde que tomé mis clases teóricas; (Lo siento.
Creo que una regla general podría ser que las funciones de utilidad deben ser estáticas. Un ejemplo típico sería cómo en cualquier lenguaje oop una clase Math contendría métodos estáticos como sqrt(), ya que realmente no es necesario tener algo así como un objeto Math separado.
En cuanto a las clases estáticas, debería pensar en las clases manteniendo una forma de estado, típicamente como información de sesión, que se necesita independientemente del ruta exacta recorrida a través de su aplicación, y de la que normalmente necesita exactamente una. (piense en su navegador, probablemente siempre manteniendo exactamente 1 cookie-jar como clase)
Las variables estáticas son las gemelas menos malvadas de las variables globales (mantienen su valor, pero con su alcance limitado a una función), que normalmente son útiles para mantener alguna forma de estado (p. almacenamiento en caché de datos) o enumerar cosas que deberían ser únicas pero cuya numeración no es muy importante fuera del alcance de su función o aplicación (por ejemplo, enumerar errores de depuración o creación de perfiles de sus propias funciones de depuración ("..") o de perfil())
Básicamente, solo usa cualquiera de ellos cuando estés seguro de que hacer las cosas de la manera correcta "OOP-like" llevaría a la creación de un monstruo.
Según tengo entendido, es cuando no tiene sentido crear un objeto de una clase para invocar una acción o esa clase es común dentro de la aplicación. Por ejemplo, en C#, la clase de consola está sellada (por lo que no puede crear un objeto y heredarlo, y realmente no tiene sentido hacerlo). Pero los profesionales te explicarán mejor, sin embargo.
Una cosa a tener en cuenta es las implicaciones de prueba de los métodos estáticos. Un método estático "sella" una gran cantidad de seams. Las costuras son donde puedes cambiar el comportamiento sin cambiar tu código de producción; los ejemplos son subclases o enlaces a una biblioteca de prueba. Dado que los métodos estáticos se resuelven en tiempo de compilación y no están vinculados dinámicamente, no puede lanzar un objeto de prueba y cambiar la forma en que se comporta un método estático. Probando esa clase va a ser un lastre.
Para cosas como las funciones matemáticas, puede estar bastante seguro de que un método estático estará bien, pero es casi seguro que no querría un método estático que se conecta a una base de datos. Piense en cómo probaría el código que usa un método estático que está pensando en hacer.
Aquí hay un buen enlace del blog de pruebas Google: Static Methods are Death to Testability
Impresionante publicación - Estoy volviendo loca Miško Hevery. ¿Has visto sus Google Tech Talks? (Creo que fue la charla titulada "The Clean Code Talks - Unit Testing", aunque todas sus charlas valen la pena). Estas conversaciones desencadenaron un momento supernovas cognitivas para mí, fusionando IOC y TDD en una especie de gran arma épica. –
"Un método estático" sella "muchas costuras". no es importante para los métodos de bajo nivel, pero importa para los métodos de nivel superior. – Raedwald
- 1. ¿Cuándo debería usar métodos públicos/privados/estáticos?
- 2. Métodos estáticos: cuándo y cuándo no
- 3. ¿Cuándo debería escribir métodos estáticos?
- 4. Métodos estáticos en clases genéricas?
- 5. en PHP, ¿cuándo debería usar métodos estáticos frente a clases abstractas?
- 6. Inicializadores estáticos y métodos estáticos En Java
- 7. En Objective-C, ¿cuándo debería usar métodos de clase y cuándo debería usar métodos de instancia?
- 8. Cuándo usar clases estáticas vs instanciadas
- 9. métodos estáticos y pruebas unitarias
- 10. Ventajas de usar métodos estáticos privados
- 11. Ventajas de las clases con solo métodos estáticos en C++
- 12. Cuándo usar interfaces o clases abstractas? Cuándo usar ambos?
- 13. ¿Mocking métodos públicos no estáticos en clases abstractas con JMockit?
- 14. Cuándo usar undef_method, y cuándo usar remove_method?
- 15. Cuándo usar las clases en C#?
- 16. genéricos de Java, singletons y métodos estáticos
- 17. Métodos estáticos falsos de múltiples clases usando PowerMock
- 18. php clases e interfaces abstractas que implican métodos estáticos?
- 19. ¿Cómo manejo las clases con métodos estáticos con Ninject?
- 20. ¿Cómo burlarse con métodos estáticos?
- 21. Clojure vars y Java métodos estáticos
- 22. Clase estática vs. ¿Clases con constructor privado y todas las propiedades y métodos estáticos?
- 23. Cuándo usar el modificador estático en PHP
- 24. Cuándo usar los métodos compartidos en .NET
- 25. Crear AlertDialog con métodos estáticos?
- 26. Cuándo usar Pepino y cuándo usar RSpec?
- 27. cuándo usar Tarea y cuándo usar Subproceso?
- 28. Cuándo usar categorías y cuándo usar subclases?
- 29. Los métodos estáticos y su anulando
- 30. Métodos estáticos y herencia en Coffeescript
Un constructor estático sólo se le llama una vez, y una clase estática permanece en la memoria para toda la vida del dominio de aplicación en el que reside el programa. - http://msdn.microsoft.com/en-us/library/79b3xss3.aspx –