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

时间:2012-10-08 12:49:59

标签: java system-properties

使用System.getProperty() / System.setProperty()将应用程序范围的变量存储在Java中是否存在任何潜在问题(安全性,性能)或一般的不良共鸣?

6 个答案:

答案 0 :(得分:4)

这是一个坏主意,因为您可以获得全局可访问变量的冲突要求。它也很难管理你对这个类的依赖。如果真的没有其他选择,我只会这样做。

答案 1 :(得分:4)

是的,这是不好的做法,原因有很多:

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

  • 类型安全:除非您的变量都是字符串,否则您会遇到属性值可能包含错误类型的问题,从而导致运行时错误,复杂性等。

  • 类型转换成本:例如,必须在每个集合上转换整数值属性并获取操作。不便宜。

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

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

当然,这是不必要的。如果确实需要“全局”变量,static变量就可以正常工作。如果您确实需要使用Properties对象来保存应用程序的(非系统)属性,请使用Properties对象的单独实例。

答案 2 :(得分:3)

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

如果你真的想使用全局变量,我认为使用单例或静态变量会更好。

答案 3 :(得分:2)

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

系统属性可以在您不知情的情况下由第三方修改,您无法对其进行太多控制。

答案 4 :(得分:1)

我建议使用属性文件并使用Properties类。

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

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

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

答案 5 :(得分:0)

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