在Java中使用系统属性存储全局变量是一种不好的做法吗?

在Java中使用系统属性存储全局变量是一种不好的做法吗?,java,system-properties,Java,System Properties,使用System.getProperty()/System.setProperty()在Java中存储应用程序范围内的变量是否会带来任何潜在问题(安全性、性能)或普遍的不良影响?这是一个坏主意,因为您可能会对全局可访问变量产生冲突的要求。管理对这个类的依赖也是非常困难的。只有在没有其他选择的情况下,我才会这样做。有更好的选择。 您至少可以使用标准的属性加载器机制加载RessourceBundle并写入/读取该捆绑包,而不是访问系统属性 第三方可以在您不知情的情况下修改系统属性,您对此没有太多控制

使用
System.getProperty()
/
System.setProperty()
在Java中存储应用程序范围内的变量是否会带来任何潜在问题(安全性、性能)或普遍的不良影响?

这是一个坏主意,因为您可能会对全局可访问变量产生冲突的要求。管理对这个类的依赖也是非常困难的。只有在没有其他选择的情况下,我才会这样做。

有更好的选择。 您至少可以使用标准的属性加载器机制加载RessourceBundle并写入/读取该捆绑包,而不是访问系统属性


第三方可以在您不知情的情况下修改系统属性,您对此没有太多控制权。

全局变量通常是设计缺陷。 您的组件应该是自包含的,不需要任何全局状态。
相反,使用公共静态字段。

这不是一个好主意。顾名思义,它用于系统属性。
查看您的代码的人很难理解它们是全局变量,而不是与系统相关的设置


如果您真的想使用全局变量,我认为最好使用单例变量或静态变量,我建议使用属性文件并使用
属性

File file = new File("your.properties");
FileInputStream input = new FileInputStream(file);

Properties properties = new Properties();
properties.load(input);

并在需要时使用
.getProperty
。我认为全局系统变量是一个坏主意。

是的,这是一个坏做法,原因很多:

  • 性能:系统属性对象是后台的哈希表。获取和设置可能比普通的getter或setter方法慢2个数量级

  • 类型安全性:除非变量都是字符串,否则属性的值可能具有错误的类型,从而导致运行时错误、复杂性等

  • 类型转换成本:例如,必须在每个set和get操作上转换整数值属性。不便宜

  • 可追溯性:查找对实变量的引用比查找对命名系统属性的引用更容易

  • 安全限制:对系统属性的访问由安全管理器控制


当然,这是没有必要的。如果您确实需要“全局”变量,
静态
变量可以很好地完成这项工作。如果您确实需要使用
Properties
对象来保存应用程序的(非系统)属性,请使用
Properties
对象的单独实例。

您是否考虑过其他方法?您的意思是,除了一般建议之外。性能:它可能较慢,但速度仍然非常快。除非每秒要获取/设置这些属性数百万次,否则性能是不会令人担心的。这是(至少)五个不同原因之一。