CodeGym/Blog Java/Random-ES/Clases estáticas anidadas
Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

Clases estáticas anidadas

Publicado en el grupo Random-ES
¡Hola! Seguimos explorando el tema de las clases anidadas en Java. En el último ejercicio hablamos de las clases anidadas no estáticas, también conocidas como clases internas. Clases anidadas estáticas - 1Hoy pasamos a otro grupo de clases. Consideraremos clases anidadas estáticas. Clases anidadas estáticas - 3¿En qué se diferencian de otras clases? Al declarar este tipo de clase, usamos la palabra clave static, con la que ya está familiarizado:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Clases anidadas estáticas - 4En este ejemplo tenemos la Boeing737clase exterior, que representa un avión de este tipo. Tiene un constructor con un parámetro: el año de fabricación ( int manufactureYear). También hay una variable estática: el número máximo de pasajeros ( int maxPassengersCount). Tendrá el mismo valor para todos los planos del mismo modelo, por lo que solo necesitamos una instancia. Además, tiene una clase anidada estática: Drawing(que representa los planos de ingeniería del avión). Usamos esta clase para encapsular toda la información oficial sobre el avión. En nuestro ejemplo, por simplicidad, hemos limitado esta clase al año de fabricación, pero podría contener mucha otra información. Clases estáticas anidadas - 5Como dijimos en la última lección, crear una clase anidada mejora la encapsulación y contribuye a una abstracción más realista. ¿Cuál es la diferencia entre clases anidadas estáticas y no estáticas? 1. Un objeto de la Drawingclase estática no almacena una referencia a una instancia específica de la clase externa. Recuerda el ejemplo de la bicicleta de la última lección:
public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }

   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
En esa lección, hablamos sobre el hecho de que cada instancia de la Handlebarclase interna, imperceptiblemente para nosotros, pasa una referencia a la instancia de la Bicycleclase externa. Sin una instancia de la clase externa, un objeto de la clase interna simplemente no podría existir. Para las clases anidadas estáticas, este no es el caso. Un objeto de una clase anidada estática es totalmente capaz de existir por sí mismo. En este sentido, las clases estáticas son más "independientes" que las no estáticas. Lo único que necesita saber es que al crear dicho objeto, debe especificar el nombre de la clase externa:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
¿Por qué hicimos la Drawingclase estática cuando en la última lección hicimos laSeatclase (que representa el asiento de la bicicleta) no estático? Como la última vez, agreguemos un poco de "filosofía" para entender el ejemplo :) A diferencia de un asiento de bicicleta, el concepto de un dibujo de ingeniería no está ligado rígidamente al concepto de un avión. Sin una bicicleta, un objeto de asiento de bicicleta separado a menudo no tendría sentido (aunque no siempre, hablamos de esto en la última lección). El concepto de un dibujo de ingeniería tiene sentido por sí solo. Por ejemplo, podría ser útil para los ingenieros que planifican el mantenimiento de aviones. El avión no es necesario para hacer el plan y se puede ubicar en cualquier lugar. Solo se necesita el dibujo de ingeniería. Además, todos los aviones del mismo modelo tendrán el mismo dibujo de ingeniero, por lo que no existe una relación tan estrecha como la que existe con un asiento de bicicleta. Por lo tanto, unDrawingEl objeto no necesita una referencia a un objeto de avión específico. 2. Diferente acceso a las variables y métodos de la clase externa. Una clase anidada estática solo puede acceder a los campos estáticos de una clase externa. En nuestro ejemplo, la Drawingclase tiene un getMaxPassengersCount()método que devuelve el valor de la maxPassengersCountvariable estática de la clase externa. Sin embargo, no podemos crear un getManufactureYear()método en la Drawingclase para devolver el valor de manufactureYear. Después de todo, la manufactureYearvariable no es estática, lo que significa que debe pertenecer a una instancia específica de Boeing737. Y como ya hemos descubierto, en el caso de clases anidadas estáticas, el objeto de la clase externa puede estar fácilmente ausente. Por lo tanto, la limitación :) No importa qué modificador de acceso tenga una variable estática en la clase externa. Incluso si esprivate, una clase anidada estática seguirá teniendo acceso. Todo lo anterior se aplica no solo al acceso a variables estáticas, sino también a métodos estáticos. ¡IMPORTANTE! En la declaración de una clase interna, la staticpalabra clave no significa que puede crear solo un objeto. No confundas objetos con variables. Si estamos hablando de variables estáticas, entonces sí, existe una sola instancia de una variable de clase estática, por ejemplo, maxPassangersCount. Pero cuando staticse aplica a una clase anidada, solo significa que sus objetos no contienen referencias a objetos de la clase externa. Y podemos crear tantos objetos como queramos:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
Declaramos el main()método directamente en la clase anidada (no hay una razón especial para esto, solo para hacerle saber que esto es posible) y creamos 5 Drawingobjetos. A pesar de que no tenemos un solo objeto de la clase externa. Como puede ver, esto no creó ningún problema :) Salida de la consola:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
¡Y eso concluye nuestra lección! Por si acaso, te dejo un enlace a la sección sobre ellos en la documentación de Oracle . Si algo sigue sin estar claro, léalo. ¡Ahora me toca resolver un par de tareas! :)
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios