Clases estáticas en Java

¿Hay algo así como static class en Java?

¿Cuál es el significado de tal clase? ¿Es necesario que todos los métodos de la clase static también sean static ?

¿Se requiere a la inversa, que si una clase contiene todos los métodos estáticos, la clase también será estática?

¿Para qué sirven las clases estáticas?

Java tiene clases anidadas estáticas, pero parece que estás buscando una clase estática de nivel superior. Java no tiene forma de hacer una clase de nivel superior estática, pero puede simular una clase estática como esta:

  • Declara tu clase final – Impide la extensión de la clase ya que extender una clase estática no tiene sentido
  • Haga que el constructor sea private : evita la creación de instancias por código de cliente, ya que no tiene sentido crear una instancia de una clase estática
  • Haga que todos los miembros y funciones de la clase sean static : dado que no se puede crear una instancia de la clase, no se pueden llamar a los métodos de instancia ni acceder a los campos de instancia.
  • Tenga en cuenta que el comstackdor no le impedirá declarar un miembro de instancia (no estático). El problema solo aparecerá si intentas llamar al miembro de la instancia

Ejemplo simple por sugerencias de arriba:

 public class TestMyStaticClass { public static void main(String []args){ MyStaticClass.setMyStaticMember(5); System.out.println("Static value: " + MyStaticClass.getMyStaticMember()); System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember()); // MyStaticClass x = new MyStaticClass(); // results in compile time error } } // A top-level Java class mimicking static class behavior public final class MyStaticClass { private MyStaticClass () { // private constructor myStaticMember = 1; } private static int myStaticMember; public static void setMyStaticMember(int val) { myStaticMember = val; } public static int getMyStaticMember() { return myStaticMember; } public static int squareMyStaticMember() { return myStaticMember * myStaticMember; } } 

¿De qué sirven las clases estáticas? Un buen uso de una clase estática es definir clases únicas, de utilidad y / o de biblioteca donde la creación de instancias no tendría sentido. Un gran ejemplo es la clase de matemáticas que contiene algunas constantes matemáticas como PI y E y simplemente proporciona cálculos matemáticos. Requerir instanciación en tal caso sería innecesario y confuso. Vea la clase de Matemáticas de Java . Tenga en cuenta que es final y que todos sus miembros son estáticos. Si Java permitiera que las clases de nivel superior se declarasen estáticas, la clase de Matemáticas sería, de hecho, estática.

Bueno, Java tiene “clases anidadas estáticas”, pero no son en absoluto iguales a las clases estáticas de C #, si es de donde venías. Una clase anidada estática es solo una que no tiene implícitamente una referencia a una instancia de la clase externa.

Las clases anidadas estáticas pueden tener métodos de instancia y métodos estáticos.

No existe una clase estática de nivel superior en Java.

Hay una clase anidada estática, esta clase [anidada estática] no necesita una instancia de la clase envolvente para poder crear una instancia por sí misma.

Estas clases [nesteds estáticos] pueden acceder solo a los miembros estáticos de la clase adjunta [ya que no tiene ninguna referencia a las instancias de la clase adjunta …]

muestra de código:

 public class Test { class A { } static class B { } public static void main(String[] args) { /*will fail - comstacktion error, you need an instance of Test to instantiate A*/ A a = new A(); /*will compile successfully, not instance of Test is needed to instantiate B */ B b = new B(); } } 

Sí, hay una clase anidada estática en java. Cuando declara una clase anidada estática, se convierte automáticamente en una clase independiente que puede crearse una instancia sin tener que instanciar la clase externa a la que pertenece.

Ejemplo:

 public class A { public static class B { } } 

Como la class B se declara estática, puede crear una instancia explícita como:

 B b = new B(); 

Tenga en cuenta que si la class B no se declaró estática para que sea independiente, una llamada a un objeto de instancia se vería así:

 A a= new A(); B b = a.new B(); 

¿Qué ocurre cuando un miembro de una class se declara static ? Se puede acceder a los miembros sin crear una instancia de la class . Por lo tanto, hacer que la clase exterior (clase de nivel superior) sea static no tiene ningún significado. Por lo tanto, no está permitido.

Pero puede establecer clases internas como estáticas (ya que es un miembro de la clase de nivel superior). Entonces se puede acceder a esa clase sin instanciar la clase de nivel superior. Considera el siguiente ejemplo.

 public class A { public static class B { } } 

Ahora, dentro de una clase diferente C , se puede acceder a la clase B sin hacer una instancia de clase A

 public class C { AB ab = new AB(); } 

static clases static pueden tener miembros non-static . Solo la clase se queda estática.

Pero si la palabra clave static se elimina de la clase B , no se puede acceder directamente sin hacer una instancia de A

 public class C { A a = new A(); AB ab = a. new B(); } 

Pero no podemos tener miembros static dentro de una clase interna non-static .

Viendo que este es el resultado principal en Google para “Java de clase estática” y la mejor respuesta no está aquí, pensé que la agregaría. Estoy interpretando la pregunta de OP en lo que respecta a las clases estáticas en C #, que se conocen como singletons en el mundo de Java. Para aquellos que no lo saben, en C #, la palabra clave “estática” se puede aplicar a una statement de clase, lo que significa que la clase resultante nunca se puede crear una instancia.

Extracto de “Effective Java – Second Edition” de Joshua Bloch (ampliamente considerada como una de las mejores guías de estilo Java disponibles):

A partir del lanzamiento 1.5, hay un tercer enfoque para implementar singletons. Simplemente haz un tipo de enumeración con un elemento:

 // Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } } 

Este enfoque es funcionalmente equivalente al enfoque de campo público, excepto que es más conciso, proporciona la maquinaria de serialización de forma gratuita y proporciona una garantía inquebrantable contra la creación de instancias múltiples, incluso frente a sofisticados ataques de serialización o reflexión. Si bien este enfoque aún no se ha adoptado ampliamente, un tipo de enumeración de elemento único es la mejor manera de implementar un singleton. (énfasis del autor)

Bloch, Joshua (2008-05-08). Java efectivo (serie Java) (p.18). Educación Pearson.

Creo que la implementación y la justificación son bastante auto explicativas.

¿Puede una clase ser estática en Java?

La respuesta es , podemos tener clases estáticas en Java. En java, tenemos variables de instancia estáticas así como métodos estáticos y también bloque estático . Las clases también se pueden hacer estáticas en Java.

En java, no podemos hacer que la clase de nivel superior (externa) sea estática. Solo las clases anidadas pueden ser estáticas.

clase anidada estática vs clase anidada no estática

1) La clase estática anidada no necesita referencia de la clase externa, pero la clase anidada no estática o la clase interna requiere una referencia de clase externa.

2) La clase interna (o clase anidada no estática) puede acceder a los miembros estáticos y no estáticos de la clase externa. Una clase estática no puede acceder a los miembros no estáticos de la clase Outer. Solo puede acceder a los miembros estáticos de la clase externa.

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Las clases externas no pueden ser estáticas, pero las clases anidadas / internas pueden ser. Eso básicamente te ayuda a usar la clase anidada / interna sin crear una instancia de la clase externa.

Java tiene métodos estáticos que están asociados con las clases (por ejemplo, java.lang.Math tiene solo métodos estáticos), pero la clase en sí misma no es estática.