Tengo una clase llena de funciones de utilidad. Instanciar una instancia de la misma no tiene sentido semántico, pero aún quiero llamar a sus métodos. ¿Cuál es la mejor manera de lidiar con esto? Clase estática? ¿Abstracto?Java: ¿Clase estática?
Respuesta
Constructor privado y métodos estáticos en una clase marcada como final.
@matt b: Como David Robles señala en su respuesta, no necesita hacer que la clase sea definitiva ... no se puede subclasificar porque una subclase no podrá invocar a un constructor de superclase porque es privada. Sin embargo ... no hay daño en ser explícito. Pero jfyi :-). – Tom
@David, ¿Por qué publicaste dos respuestas? http://stackoverflow.com/a/1844388/632951 – Pacerier
No tiene sentido declarar la clase como static
. Simplemente declare sus métodos static
y llámelos desde el nombre de clase normalmente, como la clase Math de Java.
Además, aunque no es estrictamente necesario hacer que el constructor sea privado, es una buena idea hacerlo. Marcar el constructor como privado evita que otras personas creen instancias de su clase y luego llamar a los métodos estáticos de esas instancias. (Estas llamadas funcionan exactamente de la misma en Java, son sólo engañosa y perjudican a la legibilidad del código.)
Además, no olvides hacer un constructor privado. – Asaph
@Asaph: De acuerdo. Añadí un poco sobre eso a mi respuesta. Gracias. –
Si desea métodos estáticos dentro de una clase interna, la clase también debe ser estática. –
De acuerdo con el gran libro "Effective Java":
Tema 4: Hacer cumplir noninstantiability con un constructor privado
- Intentar forzar la no instantabilidad haciendo un resumen de clase no funciona.
- Se genera un constructor por defecto sólo si una clase no contiene constructores explícitos, por lo que una clase puede hacerse no instanciable mediante la inclusión de un constructor privado:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
porque el constructor explícito es privada, se es inaccesible fuera de la clase. El AssertionError no es estrictamente obligatorio, pero proporciona un seguro en caso de que el constructor sea invocado accidentalmente desde dentro de la clase. Garantiza que la clase nunca se instanciará bajo ninguna circunstancia. Este modismo es levemente contrario a la intuición, ya que el constructor se proporciona expresamente para que no se pueda invocar. Por lo tanto, es aconsejable incluir un comentario, como se muestra arriba.
Como efecto secundario, este modismo también impide que la clase sea subclasificada. Todos los constructores deben invocar un constructor de superclase, explícita o implícitamente, y una subclase no tendría un constructor accesible de superclase para invocar.
¿Por qué eligió 'AssertionError' sobre otras alternativas como' IllegalStateException', 'UnsupportedOperationException', etc.? – Pacerier
@Pacerier Ver [este] (http://stackoverflow.com/questions/398953/what-is-the-preferred-throwable-to-use-in-a-private-utility-class-constructor). – bcsb1001
@ bcsb1001, eso nos lleva a [esto] (http://stackoverflow.com/questions/398953/what-is-the-preferred-throwable-to-use-in-a-private-utility-class-constructor/ 399074 # comment41967347_399074). – Pacerier
Solo para nadar río arriba, los miembros estáticos y las clases no participan en OO y por lo tanto son malvados. No, no es malo, pero en serio, recomendaría una clase regular con un patrón singleton para el acceso. De esta manera, si necesita anular el comportamiento en cualquier caso, no es una reorganización importante. OO es su amigo :-)
Mi $ .02
Los singletons también se consideran malvados. –
Tiene razón, me pregunto cuál es considerado peor. En última instancia, me gusta practicar la solución que tenga más sentido, es muy posible que una clase estática sea el camino a seguir. La cuestión es si todos los métodos son estáticos, ¿por qué tener un ctor privado? Para mí, el ctor privado se usa con patrones únicos. Si 'ellos' quieren una instancia de una clase sin miembros, déjelos tenerla ;-) –
Usted usa el constructor privado para evitar que alguien instancia o subclassing la clase. Ver la respuesta de David Robles: http://stackoverflow.com/questions/1844355/java-static-class/1844388#1844388 – rob
comentarios sobre los argumentos "constructor privado": se encienden, los desarrolladores no son tan estúpidos; pero ellos son perezosos. crear un objeto y luego llamar a los métodos estáticos? No va a pasar.
no pases demasiado tiempo para asegurarte de que tu clase no pueda ser mal utilizada. tener algo de fe para tus colegas. y siempre hay una manera de utilizar mal tu clase sin importar cómo la protejas. lo único que no se puede usar indebidamente es algo que es completamente inútil.
Una persona que ha visto (en código de producción, no código de estudiante jsut) object.staticMethod ¡Creo que sobreestimas las habilidades de Joe Random Programmer! :-P – TofuBeer
- clase final y constructor privado (bueno, pero no es esencial)
- métodos estáticos públicos
Parece que tienes una clase de utilidad similar a java.lang.Math.
El enfoque allí es la clase final con constructor privado y métodos estáticos.
Pero cuidado con lo que esto hace a la capacidad de prueba, recomiendo leer este artículo
Static Methods are Death to Testability
- 1. Clase estática interna en Java
- 2. Java: ¿cómo "reiniciar" una clase estática?
- 3. clase estática vs clase singleton
- 4. Diferencia entre clase simple y clase estática?
- 5. Serialización de clase interna estática
- 6. "clase estática en Objective C"
- 7. Referencia "propia" (estática) Java
- 8. clase abstracta estática
- 9. serializar una clase estática?
- 10. clase estática y singleton
- 11. Asignación de clase estática
- 12. ¿Tiene C# un equivalente de clase anidada estática de Java?
- 13. Genéricos de Java con clase e interfaz estática anidada
- 14. instancias de un Java clase interna no estática de JRuby
- 15. variable final estática pública en una clase java importada
- 16. tema visibilidad clase anidada estática con interoperabilidad Scala/Java
- 17. inicialización de variable estática java
- 18. Java: localización de cadena estática
- 19. Java alcance estática
- 20. que imita una clase estática
- 21. ¿Debo hacer esta clase estática?
- 22. C# - ¿Reiniciar la clase estática?
- 23. Clase genérica estática como diccionario
- 24. PHP: Singleton vs clase estática
- 25. Método principal en una clase interna estática.
- 26. Heredar variable estática de la clase abstracta
- 27. Java: estático vs clase interna
- 28. Diferencia de nivel bajo: clase no estática con método estático vs. clase estática con método estático
- 29. final y estática en Java
- 30. variable estática final en Java
No se puede hacer una clase de nivel superior estática por cierto ... – Jon
Por favor, no lo haga! Aquí está el por qué: http://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html – yegor256