Cuando creo clases de utilidad, normalmente creo una clase que tiene un constructor privado y expone todos sus métodos y propiedades como estáticos. ¿Cuál es el mejor enfoque para esto? ¿Cuál es la diferencia entre la forma en que lo hago o la creación de una clase estática?Clase estática vs. ¿Clases con constructor privado y todas las propiedades y métodos estáticos?
Respuesta
Las clases estáticas se cierran automáticamente, por lo que las personas no pueden heredar y anular su comportamiento.
Esa es la única diferencia real (a menos que haya algo especial en el IL)
tanto, si utiliza una clase estática, se ahorra la molestia de hacer que el constructor privado, y la declaración de la clase sellada.
Yo agregaría, que definir una clase como estática, es un código "autodocumentado". Los usuarios de su biblioteca sabrán que esta clase no se debe instanciar, y solo tiene valores estáticos.
Una clase estática nunca se puede crear una instancia. De ninguna manera, no cómo.
Una clase no estática con un constructor privado, pero todos los métodos estáticos se pueden abusar de varias maneras: herencia, reflexión, llamar al constructor privado en una fábrica estática, para instanciar la clase.
Si nunca quiere instanciación, me gustaría ir con la clase estática.
Editar - Aclaración para el comentario de FosterZ
Digamos que tiene esta clase de utilidad:
public class Utility
{
public static string Config1 { get { return "Fourty Two"; } }
public static int Negate(int x) { return -x; }
private Utility() { }
}
Si otro desarrollador no es claro en su intención, podrían hacer esto:
public class Utility
{
public static string Config1 { get { return "Fourty Two"; } }
public int Config2 { get; set; }
public static int Negate(int x) { return -x; }
private Utility() { }
/// Get an instance of Utility
public static Utility GetUtility()
{
return new Utility();
}
}
Ahora tiene un Frankenstei n clase. Algunas de sus características requieren instanciación y otras no. Tal vez eso es lo que quieres, pero tal vez no lo es. Podría evitar esto con la revisión del código, pero ¿por qué no hacer explícitas sus intenciones en el código? Marcar la clase como static
elimina cualquier posible confusión. No puede instanciar una clase estática o heredar de ella.
puede darme un pequeño ejemplo para este punto "llame al constructor privado en una fábrica estática - para crear una instancia de la clase", m resulta difícil de entender esto ... – FosterZ
@FosterZ - He añadido un ejemplo a mi respuesta. Aclamaciones. –
thnku mucho tio .... ahora lo entiendo ... – FosterZ
Además de las respuestas anteriores: El compilador no permitirá miembros no estáticos en clases estáticas y produce errores. Esto puede ayudar un poco a no agregar accidentalmente miembros no estáticos.
También voy a ir con el constructor privado que nunca es llamado por los métodos estáticos. Entonces, cualquier inicialización sería desperdiciada ... Pero eso es solo una teoría.
puede pasar el objeto de una clase que tiene un constructor privado como parámetro para cualquier método pero no puede hacer lo mismo con la clase estática. Esta es la gran diferencia.
- 1. clase estática y singleton
- 2. Cuándo usar clases y métodos estáticos?
- 3. ¿Cómo se organizan métodos y propiedades dentro de una clase?
- 4. ¿Por qué las clases estáticas no pueden tener métodos y variables no estáticos?
- 5. Posible enumerar todas las clases PHP y sus métodos y propiedades?
- 6. Ámbito privado del objeto Scala con clases internas y métodos
- 7. C instancia # clase con métodos estáticos vs uso de memoria clase estática
- 8. constructor privado y final
- 9. Herencia de PHP y métodos y propiedades estáticos
- 10. ¿Cómo manejo las clases con métodos estáticos con Ninject?
- 11. ¿Constructor con todas las propiedades de clase o constructor predeterminado con setters?
- 12. ¿Cuál es la diferencia entre los métodos estáticos en una clase no estática y los métodos estáticos en una clase estática?
- 13. Ventajas de las clases con solo métodos estáticos en C++
- 14. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 15. Métodos estáticos en clases genéricas?
- 16. Inicializadores estáticos y métodos estáticos En Java
- 17. clase estática vs clase singleton
- 18. ¿Podemos tener un constructor privado en una clase estática?
- 19. Tengo una clase con 14 métodos estáticos y 4 propiedades estáticas, ¿es malo?
- 20. Instanciando clase interna con constructor privado
- 21. métodos estáticos y pruebas unitarias
- 22. Métodos estáticos y de instancia con el mismo nombre?
- 23. informe de clases y métodos
- 24. JUnit: prueba la clase auxiliar con solo métodos estáticos
- 25. .NET Diccionario vs Las propiedades de clase
- 26. ¿Tiene acceso a la propiedad estática a través de métodos estáticos y no estáticos?
- 27. métodos estáticos C++ Singleton Vs
- 28. Diferencia de nivel bajo: clase no estática con método estático vs. clase estática con método estático
- 29. C++ inicialización estática vs __ __attribute ((constructor))
- 30. Campos estáticos en una clase base y clases derivadas
Realmente hay algo especial en la IL. Las clases estáticas están marcadas como abstractas y selladas (lo que no se puede hacer desde C#), lo que impide completamente la creación de instancias. –
Tenga en cuenta que de acuerdo con Mehrdad ([aquí] (http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static -me/5241927 # 5241927)), otra diferencia es que los métodos estáticos en clases no estáticas no pueden ser métodos de extensión. – Benjol