Controlando la visibilidad de la clase y la interfaz en Java

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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();
    }
}
Producción

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();
    }
}
Producción

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *