Uso de variables / constantes globales en Java

U

 

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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad