Uso de variables / constantes globales en Java

     

    Introducci贸n

    La estructura de c贸digo orientada a objetos de Java puede dificultar la referenciaci贸n de variables en varios lugares. A veces, tambi茅n puede ser dif铆cil decidir de qu茅 clase debe formar parte una variable determinada, especialmente si se trata de un valor ampliamente utilizado como un conector de base de datos o una constante matem谩tica.

    En muchos lenguajes, ante un problema como este, podemos declarar una variable global. Aunque, desafortunadamente, Java no permite t茅cnicamente la creaci贸n de variables en un 谩mbito global.

    En este art铆culo, repasaremos la emulaci贸n y el uso de variables globales en Java.

    驴Qu茅 es una variable global?

    Una variable global es una variable a la que se puede acceder desde cualquier 谩mbito. Muchos lenguajes de programaci贸n cuentan con una sintaxis especial para declarar una variable global, por ejemplo, Python nos permite usar el global palabra clave:

    global a_variable = 5
    

    C crea globales simplemente declarando una variable fuera de una funci贸n.

    int aVariable = 3;
    
    int someFunction() {
        print(aVariable);
    }
    

    Independientemente de la sintaxis para crear la variable global, funcionan m谩s o menos de la misma manera. Le permiten acceder y modificar el valor desde dentro de cualquier otra clase o funci贸n. Esto puede causar problemas si intenta reutilizar el nombre en otro 谩mbito. Por ejemplo:

    int aVariable = 3;
    
    int someFunction() {
        int aVariable = 7;
        print(aVariable);
    }
    

    Dependiendo del idioma, esto generalmente se maneja de una de estas tres formas:

    • Lanza un error por declarar una variable que ya existe.
    • Suponga que la declaraci贸n de impresi贸n hace referencia a la variable local.
    • Suponga que la declaraci贸n de impresi贸n hace referencia a la variable local a menos que se utilice una sintaxis especial para hacer referencia a la global.

    El tercer m茅todo es c贸mo Java maneja las variables de instancia cuando un par谩metro de m茅todo usa el mismo nombre. Imagina una clase con una variable declarada como private int number. Para modificar el valor de number m谩s adelante, podr铆a crear una funci贸n:

    public int setNumber(int number) {
        this.number = number;
    }
    

    los this la palabra clave muestra que desea el number de la clase, no de los par谩metros del m茅todo.

    驴Por qu茅 Java no usa variables globales?

    La respuesta corta a esta pregunta es: dise帽o intencional. Java se cre贸 como un lenguaje de programaci贸n puramente orientado a objetos, raz贸n por la cual todo lo que crea est谩 incluido en una clase.

    Al estar puramente orientados a objetos, se anima a los desarrolladores a mantener juntas las variables y funciones relacionadas, haciendo que el programa en su conjunto sea m谩s organizado. Esto tambi茅n puede ayudar a identificar el prop贸sito de una variable mal documentada. Por ejemplo:

    class GridCoordinate {
        int x;
        int y;
    }
    

    Sin el conocimiento de que estas variables eran parte de un GridCoordinate clase, ser铆a casi imposible identificarlos. Con el contexto del nombre de la clase, podemos inferir que son las posiciones horizontal y vertical de un punto dado en una cuadr铆cula.

    Ahora imagina que est谩s trabajando como parte de un equipo completamente remoto con miembros en todo el mundo. Usted y un compa帽ero de trabajo en otro continente est谩n trabajando en el mismo archivo cuando ambos se encuentran con esto:

    global ver = 2.55
    

    Supone que la variable representa un n煤mero de versi贸n. Su compa帽ero de trabajo cree que podr铆a tener algo que ver con un eje vertical. Ambos realizan cambios en diferentes funciones en funci贸n de sus suposiciones, modificando y haciendo referencia al valor como mejor le parezca.

    Este es el tipo de situaci贸n que Java intenta evitar al no tener variables globales. El uso de variables globales en un proyecto grande puede dar lugar a un comportamiento no deseado e inesperado, ya que las variables se declaran y modifican en diferentes secciones del c贸digo.

    驴C贸mo emular una variable global en Java?

    Aunque existen algunos inconvenientes en el uso de variables globales, hay ocasiones en las que es posible que desee acceder a una variable en muchos lugares, pero puede sentir que no justifica la creaci贸n de una clase contenedora dedicada.

    Por ejemplo, es posible que desee hacer referencia a la conexi贸n de su base de datos en varias clases, pero no ha declarado una DatabaseConnection class para manejar toda la funcionalidad de su base de datos. Tambi茅n puede preferir simplemente usar los m茅todos integrados de la biblioteca de base de datos de su elecci贸n sin un contenedor para manejar las transacciones.

    Por lo general, puede crear un Constants o un Reference class, donde mantiene almacenados varios valores “globales” si se usan com煤nmente en otras partes de la aplicaci贸n. Una sola variable no garantiza necesariamente una clase completa, por lo que puede abarcar muchas de ellas en una sola Reference o Constants clase:

    public class Reference {
        public static final double VERSION_NUMBER;
        public static final String DATABASE_URL;
        public static final Database DATABASE;
    }
    

    Luego se puede acceder a estas variables en otro lugar haciendo referencia a la clase:

    public int someMethod() {
        System.out.println(Reference.VERSION_NUMBER);
    }
    

    Tener el Reference La clase hace que sea f谩cil saber d贸nde buscar comentarios que expliquen el prop贸sito de la variable. Si las variables anteriores se hubieran creado como verdaderas variables globales, es probable que se hubieran creado en diferentes archivos, lo que har铆a m谩s dif铆cil encontrar el prop贸sito del autor.

    Una mejor forma de utilizar Reference clase ser铆a tratar todas las variables como privadas y usar m茅todos getter para controlar todo el acceso a los valores. Tambi茅n es aconsejable utilizar constantes en lugar de variables para los datos que no deben cambiar mientras se ejecuta el programa. Por ejemplo:

    private static final String DATABASE_URL = "https://databaseurl.db/database";
    private static final Database DATABASE = Database.connect(databaseURL);
    
    public static Database getDatabase() { return DATABASE; }
    public static String getUrl() { return DATABASE_URL}
    

    En este ejemplo, la URL de la base de datos y la conexi贸n de la base de datos no se pueden modificar en ning煤n otro lugar del c贸digo, pero se puede hacer referencia a la conexi贸n de la base de datos seg煤n sea necesario para las transacciones.

    Si bien esto no es tan limpio sint谩cticamente como definir una variable global, puede proporcionar el mismo nivel de libertad.

    Otro uso com煤n ser铆a definir algunas constantes en una aplicaci贸n que tiene valores inmutables que usa con frecuencia. Por ejemplo, si est谩 entrenando una red neuronal o ejecutando algoritmos gen茅ticos, tendr谩 varios valores utilizados en todas partes:

    public static final int GENERATION_SIZE;
    public static final int GENOME_SIZE;
    public static final int REPRODUCTION_SIZE;
    public static final int MAX_ITERATIONS;
    

    Luego, acceder铆a a estos a trav茅s de su clase p煤blica, como:

    for(int i = 0; i < Constants.MAX_ITERATIONS; i++) {
      // ...
    }
    

    Conclusi贸n

    Las variables globales a menudo se consideran un tema divisivo, y muchos desarrolladores dicen que nunca deber铆an usarse. Estos desarrolladores generalmente argumentan que las variables globales hacen que el c贸digo sea m谩s dif铆cil de mantener. Sin embargo, hay algunos casos en los que las variables similares a las globales son 煤tiles siempre que est茅n bien organizadas y claramente identificadas.

    En 煤ltima instancia, la decisi贸n de utilizarlos recae en usted o en un miembro senior del equipo de desarrollo.

    En este art铆culo, hemos repasado c贸mo emular variables globales en Java.

     

    Etiquetas:

    Deja una respuesta

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