El mantenimiento es uno de los aspectos importantes del desarrollo de software, y la experiencia ha demostrado que el software que mantiene baja la visibilidad de su componente es más fácil de mantener que uno que expone más su componente. No lo sabrá por adelantado, pero cuando rediseñe la aplicación, lo extrañará terriblemente.
Termina parcheando y repitiendo los mismos errores, ya que mantener la compatibilidad con versiones anteriores es un requisito imprescindible para muchas aplicaciones. No hará mucho porque la clase y las interfaces están estrechamente integradas con muchas otras aplicaciones. Java siempre ha priorizado la encapsulación, proporcionando modificadores de acceso de soporte desde el principio. Al hacerlos públicos, paquetes privados o privados, se brindan formas de monitorear la visibilidad de algún tipo, como una clase o una interfaz.
A continuación se presentan algunas reglas para controlar la visibilidad:
- Una clase de nivel superior (una clase cuyo nombre es el mismo que el archivo fuente de Java que la contiene) también puede ser un paquete público o privado (sin un modificador de acceso) y no puede ser privado. Private, public o package-private solo pueden ser una clase anidada.
- Una clase pública es accesible para todos y es más visible, intente mantener públicas solo las interfaces clave, nunca permita que la implementación se haga pública hasta que crea que está completa y madura.
- El tipo privado, por otro lado, es menos visible, y en Java, solo la clase o interfaz anidada puede ser privada. Tienes control total sobre esta clase para cambiar sus acciones con experiencias, nueva tecnología, herramientas y rediseño, ya que es menos visible.
- La visibilidad privada del paquete es un medio inteligente y también es visibilidad predeterminada, no existe una palabra clave como paquete privado, en cambio, si no tiene ningún modificador de acceso, ya que Java cree que es privado del paquete, y luego lo hace solo visible en el mismo paquete.
- Si las clases y las interfaces solo se comparten dentro del mismo paquete entre otras clases, hágalas privadas como paquete. Como el cliente no puede alcanzarlos, es razonablemente seguro cambiarlos.
¿Cómo controlar la visibilidad de la clase o la interfaz en Java?
Además de disminuir la visibilidad de la clase o la interfaz mediante el modificador de acceso, según su entorno de tiempo de ejecución, hay muchas otras formas de hacerlo. En el nivel de componente, como Websphere, Weblogic o JBoss en el servidor de aplicaciones, una clase de interfaz se puede usar como proxy o encapsulada para reducir la visibilidad externa.
No importa lo que haga, todavía habrá ciertos tipos que deben exponerse al mundo exterior, pero siempre puede manejarlos con proxy o contenedor. Aunque los programas cliente cargarán clases de implementación de proxy, a menudo se obtendrá un proxy o contenedor inmutable.
Por ejemplo, la API de Java Servlet (javax.servlet) getServletContext() devuelve una implementación de javax.servlet.ServletContext, que suele ser un proxy inmutable para satisfacer las promesas del marco ServletContext. Lo más probable es que una versión separada de la especificación javax.servlet.ServletContext opere en el servidor de aplicaciones.
Es posible usar un patrón similar en la implementación de otras interfaces accesibles externamente, por ejemplo, Javax.ejb.EJBContext, Javax.ejb.TimerService, ServletRequest, ServletResponse, etc. Para soportar estas interfaces globales, varios servidores de aplicaciones pueden usar varias aplicaciones.
Ejemplo de JDK de control de visibilidad de la clase Java
La clase EnumSet es otro ejemplo fascinante de gestión de la visibilidad. Para evitar la creación de instancias, el diseñador de Java creó la clase abstracta y proporcionó métodos de fábrica como la única forma de crear una instancia de esa clase, por ejemplo, Métodos de EnumSet.of() o EnumSet.noneOf().
Internamente, en forma de RegularEnumSet y JumboEnumSet, tienen dos implementaciones separadas, que se seleccionan automáticamente en función del tamaño del universo principal mediante métodos de fábrica estáticos.
Por ejemplo, si el número de valores en Enum es inferior a 64, se utiliza RegularEnumSet; de lo contrario, se devuelve la instancia de JumboEnumSet. La belleza de este diseño es que el paquete privado significa que los consumidores no tienen idea de ninguna de estas implementaciones.
modificador | Descripción |
---|---|
Defecto | las declaraciones solo son visibles dentro del paquete (paquete privado) |
Privado | las declaraciones son visibles solo dentro de la clase |
Protegido | las declaraciones son visibles dentro del paquete o todas las subclases |
Público | las declaraciones son visibles en todas partes |
Modificador de acceso privado
Java
// Java program for showcasing the behaviour // of Private Access Modifier class Data { // private variable private String name; } public class Main { public static void main(String[] main){ // create an object of Data Data d = new Data(); // access private variable and field from another class d.name = "Kapil"; } }
Producción:
Main.java:18: error: name has private access in Data d.name = "Programiz"; ^
En el ejemplo anterior, hemos declarado una variable privada llamada name y un método privado llamado display(). Cuando ejecutemos el programa, obtendremos el error anterior:
Modificador de acceso protegido
Java
// Java program for showcasing the behaviour // of Protected Access Modifier class Animal { // protected method protected void display() { System.out.println("I am an animal"); } } class Dog extends Animal { public static void main(String[] args) { // create an object of Dog class Dog dog = new Dog(); // access protected method dog.display(); } }
I am an animal
Modificador de acceso público:
Java
// Java program for showcasing the behaviour // of Public Access Modifier // Animal.java file // public class class Animal { // public variable public int legCount; // public method public void display() { System.out.println("I am an animal."); System.out.println("I have " + legCount + " legs."); } } // Main.java public class Main { public static void main( String[] args ) { // accessing the public class Animal animal = new Animal(); // accessing the public variable animal.legCount = 4; // accessing the public method animal.display(); } }
I am an animal. I have 4 legs.
Publicación traducida automáticamente
Artículo escrito por manikumarsingh789 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA