usar restricción que métodos metodos metodo los llamar estáticos estaticos estatico ejemplos definicion cuando como clases clase atributos atributo java static singleton nio

restricción - que es un atributo en java



Práctica recomendada de Java: clase con solo métodos estáticos (6)

¿Por qué no debería ser una buena práctica si solo tiene métodos que proporcionan "herramientas" a otras clases? Esto está bien.

Tengo una aplicación donde tengo una clase llamada PlausibilityChecker . Esta clase solo tiene métodos estáticos, como checkZipcodeFormat o checkMailFormat . Los uso en mis clases de GUI para verificar la entrada antes de enviarla a la capa inferior.

¿Es esta buena práctica? Pensé que solo usaría métodos estáticos para no tener que preocuparme por pasar una instancia a las clases de GUI o tener un campo de instancia en cada clase de gui que no haga referencia a un objeto de gui.

Noté que la clase de Files de Java NIO solo tiene métodos estáticos, así que asumo que esto no puede ser tan horriblemente incorrecto.


En Java 8 ahora puede cambiar sus clases de utilidades estáticas a interfaces con implementaciones estáticas. Esto elimina la necesidad de hacer la clase final y tener que proporcionar un constructor privado. Es tan simple como cambiar ''clase'' a ''interfaz'' y eliminar la palabra final si la tiene (todas las interfaces son abstractas, por lo que no pueden ser definitivas). Dado que los métodos de interfaz son siempre públicos, puede eliminar cualquier ámbito público de ellos. Si tiene un constructor privado, elimínelo también (no puede compilar una interfaz con un constructor, ya que no se pueden crear instancias). Es menos código y se ve más limpio. No tendrás que refactorizar ninguna clase que ya lo use.


Las clases con solo métodos estáticos son un patrón común en Java para los métodos de utilidad. Los ejemplos en la biblioteca estándar incluyen Files , Collections y Executors .

Para tales clases de utilidad, es una buena idea asegurarse de que no se pueda crear una instancia de su clase, para dejar clara la intención de la clase. Puedes hacerlo declarando explícitamente un constructor privado. Para obtener más información, consulte el Artículo 4: Imponer la no instalación con un constructor privado en "Java efectiva" de Josh Bloch.


No te preocupes por la subclasificación o la creación de instancias. Las siguientes clases de utilidades en JDK pueden ser subclasificadas o instanciadas, sin embargo, nadie las ha usado mal en todos esos años. La gente no es tan estúpida.

java.beans.Beans java.beans.PropertyEditorManager java.lang.invoke.LambdaMetafactory java.lang.reflect.Modifier java.net.URLDecoder ...but not URLEncoder:) javax.management.DefaultLoaderRepository javax.management.Query javax.management.loading.DefaultLoaderRepository javax.management.relation.RoleStatus javax.print.ServiceUI javax.swing.UIManager javax.swing.plaf.basic.BasicBorders javax.swing.plaf.basic.BasicGraphicsUtils javax.swing.plaf.basic.BasicHTML javax.swing.plaf.basic.BasicIconFactory javax.swing.plaf.metal.MetalBorders javax.swing.plaf.metal.MetalIconFactory javax.swing.text.Utilities javax.swing.text.html.HTML

Sin embargo, como API pública, desea suprimir el constructor predeterminado, de lo contrario, hay un constructor no documentado en la página javadoc que es incómodo y confuso. Para sus propias API internas, no importa, a nadie le importa.

Sin embargo, no hay razón para suprimir la subclasificación. Si alguien quiere subclasificar una clase de utilidad, por cualquier razón, déjelo. Por supuesto, el constructor privado suprimirá la subclasificación como efecto secundario.

En java8, hay más posibilidades de diseño a considerar -

Una interfaz con todos los métodos estáticos : esto es tan bueno como una clase con todos los métodos estáticos. Ni la interfaz ni la clase están diseñadas para este propósito, por lo que cualquiera de ellas está bien. Sin embargo, no espere heredar estos métodos estáticos en los subtipos de la interfaz; los métodos estáticos de la interfaz no son heredables. Un punto a favor para usar la interfaz es que no necesitamos suprimir el constructor predeterminado para que no aparezca en javadoc.

Una interfaz con todos los métodos predeterminados : se accede a través de la herencia. Esto es interesante pero problemático en general (la herencia solo funciona en un contexto no estático). Pero podría ser una mejor opción en algunos diseños de API, por ejemplo, esta API html builder .


Singleton están bien, dependiendo del contexto.

Para propósitos de prueba, es posible que desee simular referencias a singletons para evitar efectos secundarios durante las pruebas de unidad. En ese caso, probablemente tenga sentido usar un marco de inyección de dependencias como Spring para manejar la creación de la instancia y usar métodos regulares que se pueden anular en lugar de métodos estáticos.

Si aún planea usar métodos estáticos, asegúrese de que las llamadas sean seguras para subprocesos si se usan en un contexto de subprocesos múltiples. (por ejemplo, bloqueo de doble control).


Yo diría que lo estás haciendo bien. Aparte de eso, algunos consejos para su clase de utilidad:

  • Asegúrese de que no tiene ningún estado. Esto es, no hay ningún campo en la clase a menos que se declare static final . Además, asegúrese de que este campo también sea inmutable, por ejemplo, String s.
  • Asegúrate de que no pueda ser una súper clase de otras clases. Haz la clase final para que otros programadores no puedan extenderla.
  • Este es discutible, pero puede declarar que un constructor sin argumentos es private , por lo que ninguna otra clase podría crear una instancia de su clase de utilidad (usar la reflexión o algo similar hará, pero no hay necesidad de ir con esa clase de protección). ¿Por qué no puedes hacer esto? Bueno, este es el caso extraño en el que desea / necesita inyectar una instancia de la clase de utilidad, por ejemplo, a través de una interfaz en lugar de usarla directamente a lo largo de su clase. Aquí hay un ejemplo de esto . Este diseño es realmente extraño, pero puede suceder (como se muestra en el enlace anterior), pero si no se ejecuta en tal caso, el mejor consejo es mantener la privacidad del constructor.

Hay muchas bibliotecas que ofrecen clases de utilidad para ayudarnos a los programadores con nuestro trabajo. Uno de los más conocidos es el conjunto común de bibliotecas de Apache . Es de código abierto y puede verificar el código para ver cómo diseñan estas clases de utilidades para crear las suyas. (DESCARGO DE RESPONSABILIDAD: No trabajo ni apoyo estas bibliotecas, soy un usuario feliz de ellas)

Nota importante: evite usar un singleton para su clase de utilidad .