Los globales no son tan malos. Como se indicó en varias otras respuestas, el verdadero problema con ellas es que, hoy, su ruta de carpeta global puede ser, mañana, una de varias, o incluso cientos. Si está escribiendo un programa rápido y único, use globales si es más fácil. En general, sin embargo, permitir múltiples, incluso cuando solo cree que necesita uno, es el camino a seguir. No es agradable tener que reestructurar un gran programa complejo que de repente necesita hablar con dos bases de datos.
Pero no perjudican la fiabilidad. Cualquier dato al que se haga referencia desde muchos lugares en su programa puede causar problemas si cambia inesperadamente. Los enumeradores se ahogan cuando la colección que están enumerando cambia a mitad de la enumeración. Los eventos de la cola de eventos pueden jugar trucos entre ellos. Los hilos siempre pueden causar havok. Cualquier cosa que no sea una variable local o un campo inalterable es un problema. Los problemas globales son este tipo de problema, pero no vas a solucionarlo haciéndolos no globales.
Si está a punto de escribir en un archivo y la ruta de la carpeta cambia, el cambio y la escritura deben sincronizarse. (Como una de las mil cosas que podrían salir mal, digamos que toma la ruta, luego ese directorio se elimina, luego la ruta de la carpeta se cambia a un buen directorio, luego intenta escribir en el directorio eliminado). El problema existe si la ruta de la carpeta es global o es una de las mil que el programa está usando actualmente.
Existe un problema real con los campos a los que pueden acceder diferentes eventos en una cola, diferentes niveles de recursión o diferentes subprocesos. Para hacerlo simple (y simplista): las variables locales son buenas y los campos son malos. Pero los antiguos niveles globales seguirán siendo campos, por lo que este problema (aunque de importancia crítica) no se aplica al estado Bueno o Malo de los campos globales.
Adición: Problemas de subprocesos múltiples:
(Tenga en cuenta que puede tener problemas similares con una cola de eventos o llamadas recursivas, pero el subproceso múltiple es, con mucho, el peor). Considere el siguiente código:
if (filePath != null) text = filePath.getName();
Si filePath
es una variable local o algún tipo de constante, su programa no fallará cuando se ejecute porque filePath
es nulo. El cheque siempre funciona. Ningún otro hilo puede cambiar su valor. De lo contrario , no hay garantías. Cuando comencé a escribir programas multiproceso en Java, obtuve NullPointerExceptions en líneas como esta todo el tiempo. Algunaotro hilo puede cambiar el valor en cualquier momento, y a menudo lo hacen. Como señalan otras respuestas, esto crea serios problemas para las pruebas. La declaración anterior puede funcionar mil millones de veces, realizar pruebas exhaustivas y exhaustivas, y luego explotar una vez en producción. Los usuarios no podrán reproducir el problema, y no volverá a suceder hasta que se hayan convencido de que estaban viendo cosas y lo hayan olvidado.
Los globales definitivamente tienen este problema, y si puede eliminarlos por completo o reemplazarlos con constantes o variables locales, eso es algo muy bueno. Si tiene código sin estado ejecutándose en un servidor web, probablemente pueda. Por lo general, todos los problemas de subprocesos múltiples pueden ser asumidos por la base de datos.
Pero si su programa tiene que recordar cosas de una acción del usuario a la siguiente, tendrá campos accesibles por cualquier subproceso en ejecución. Cambiar un campo global a uno no global no ayudará a la confiabilidad.