全球人还不错。如其他一些答案所述,它们的真正问题是,今天,明天,您的全局文件夹路径可能是几个甚至数百个之一。如果您要编写一个快速的一次性程序,请使用全局变量(如果更简单)。通常,尽管如此,即使您只认为自己需要一个倍数,也要走多路。必须重组一个突然需要与两个数据库通信的大型复杂程序,这并不令人愉快。
但是它们不会损害可靠性。如果程序意外更改,那么从程序中许多地方引用的任何数据都可能导致问题。枚举器在枚举过程中更改枚举时,会使它们感到窒息。事件队列事件可以彼此玩弄。线程总是会发疯。任何不是局部变量或不可更改字段的问题。全局变量是这类问题,但您不会通过使其不具有全局变量来解决此问题。
如果要写入文件,并且文件夹路径更改,则更改和写入需要同步。(作为一千种可能出错的事情之一,例如,您抓住路径,然后将该目录删除,然后将文件夹路径更改为一个好的目录,然后尝试写入已删除的目录。)是否存在问题文件夹路径是全局路径,或者是程序当前正在使用的千路径之一。
可以通过队列中的不同事件,不同级别的递归或不同线程访问的字段确实存在问题。简单地说(和简单化):局部变量是好的而字段是坏的。但前者的全局变量仍然会是场,所以这(但是非常重要)的问题也不能适用于全球领域的正义或邪恶的状态。
另外:多线程问题:
(请注意,事件队列或递归调用可能会遇到类似的问题,但是多线程是最糟糕的。)请考虑以下代码:
if (filePath != null) text = filePath.getName();
如果filePath
是局部变量或某种常量,则您的程序在运行时不会失败,因为它filePath
为null。支票始终有效。没有其他线程可以更改其值。 否则,没有任何保证。当我开始用Java编写多线程程序时,我总是在这样的行上看到NullPointerExceptions。 任何其他线程可以随时更改该值,而且它们经常这样做。正如其他几个答案所指出的那样,这给测试带来了严重的问题。上面的陈述可以工作十亿次,经过广泛而全面的测试,然后在生产中就被炸毁。用户将无法重现该问题,并且直到他们确信自己看到并忘记了该问题之后,该问题才会再次发生。
全局变量肯定存在此问题,如果您可以完全消除它们或将它们替换为常量或局部变量,那将是一件非常好的事情。如果您在Web服务器上运行无状态代码,则可能可以。通常,您的所有多线程问题都可以由数据库解决。
但是,如果您的程序必须记住从一个用户操作到下一个用户操作的所有内容,那么您将拥有可由任何正在运行的线程访问的字段。将全局字段切换到此类非全局字段将无助于可靠性。