Globais não são tão ruins. Como afirmado em várias outras respostas, o verdadeiro problema com elas é que, hoje, o caminho de sua pasta global pode, amanhã, ser uma das várias, ou mesmo centenas. Se você estiver escrevendo um programa rápido e único, use globals se for mais fácil. Geralmente, porém, permitir múltiplos, mesmo quando você pensa que precisa apenas de um, é o caminho a percorrer. Não é agradável ter que reestruturar um grande programa complexo que de repente precisa conversar com dois bancos de dados.
Mas eles não prejudicam a confiabilidade. Quaisquer dados referenciados de vários locais do seu programa podem causar problemas se forem alterados inesperadamente. Os enumeradores engasgam quando a coleção que eles estão enumerando é alterada na enumeração intermediária. Eventos da fila de eventos podem fazer truques um com o outro. Threads sempre podem causar estragos. Qualquer coisa que não seja uma variável local ou um campo imutável é um problema. Globais são esse tipo de problema, mas você não vai consertar isso, tornando-os não globais.
Se você estiver prestes a gravar em um arquivo e o caminho da pasta for alterado, a alteração e a gravação precisarão ser sincronizadas. (Como uma das milhares de coisas que podem dar errado, digamos que você pegue o caminho, esse diretório será excluído, o caminho da pasta será alterado para um bom diretório e tente gravar no diretório excluído.) o caminho da pasta é global ou é um dos mil que o programa está usando no momento.
Há um problema real com campos que podem ser acessados por diferentes eventos em uma fila, diferentes níveis de recursão ou diferentes threads. Para simplificar (e simplificar): variáveis locais são boas e campos são ruins. Mas os ex-globais ainda serão campos, portanto essa questão (por mais importante que seja) não se aplica ao status de bem ou mal dos campos globais.
Adição: problemas de multithreading:
(Observe que você pode ter problemas semelhantes com uma fila de eventos ou chamadas recursivas, mas o multithreading é de longe o pior.) Considere o seguinte código:
if (filePath != null) text = filePath.getName();
Se filePath
for uma variável local ou algum tipo de constante, seu programa não falhará durante a execução porque filePath
é nulo. A verificação sempre funciona. Nenhum outro encadeamento pode alterar seu valor. Caso contrário , não há garantias. Quando comecei a escrever programas multithread em Java, recebia NullPointerExceptions em linhas como essa o tempo todo. Qualqueroutro segmento pode alterar o valor a qualquer momento, e geralmente o fazem. Como várias outras respostas apontam, isso cria sérios problemas para o teste. A declaração acima pode funcionar um bilhão de vezes, passando por testes extensivos e abrangentes e explodir uma vez na produção. Os usuários não poderão reproduzir o problema, e isso não acontecerá novamente até que eles se convencam de que estão vendo as coisas e as esquecem.
Os Globals definitivamente têm esse problema, e se você pode eliminá-los completamente ou substituí-los por constantes ou variáveis locais, isso é uma coisa muito boa. Se você tem código sem estado em execução em um servidor web, provavelmente pode. Normalmente, todos os seus problemas de multithreading podem ser assumidos pelo banco de dados.
Mas se o seu programa precisar se lembrar de uma ação do usuário para a próxima, você terá campos acessíveis por qualquer thread em execução. Mudar um campo global para um campo não global não ajudará na confiabilidade.