首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java中的常量与属性

java中的常量与属性
EN

Stack Overflow用户
提问于 2017-04-28 07:55:43
回答 5查看 6.4K关注 0票数 2

在我的java程序中声明常量值的最佳方法是什么?

是在.properties文件中声明常量值还是在不同类中将该值声明为静态最终值的最佳方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-04-28 08:46:58

问题的答案取决于你想要完成什么。但其中也有一个误解。

属性文件

属性文件并不意味着替代或替代常量。它们用于存储可配置的值,如ip、语言等。从文件加载常量不符合常量的目的。

常数

另一点是,public static final变量在java中不是一种很好的方法,首选的方法是使用枚举器。(来自有效Java,第30项:使用枚举而不是int constatns)。enum将迫使您以有意义的方式对常量进行分组,而充满随机public常量的类很难管理。Enum使您能够提供功能,例如检查、验证、将常量与倍数对象关联起来,并且可以在switch语句中使用它。Enums也被编译,这使得它们更有效率,更有类型。这本书更详细地解释了enums的好处。

我认为最好的方法是考虑值是否会根据某些外部因素而变化,还是始终保持不变。

属性文件和对配置的全局访问

假设您的属性文件中有一个ip,并且您希望能够从代码中的任何地方访问这个值。您只需读取该值并将其加载到公共静态最终变量中即可。

如果这样做,如何控制该值被初始化,或者配置的值是正确的?在这种情况下,您可以使用单例类模式(只能存在类的一个实例),它加载文件并检查值是否正确。

它可以将值存储在private static final变量中,并启用一个getter来执行所需的检查,以确保值是正确的。这使您可以全局访问变量,并在一个地方将逻辑分组。

下次在文件中添加值时,只需更新这个类,而不需要在代码中搜索它所在的位置以及检查是否正确。

Note

许多人说,没有真正的“最好的方式”做某事。我认为这是真的,但如果您能够访问Effetive Java ( Joshua )这样的书籍,您应该阅读它们,并向已经编码了很长时间的人学习。

票数 7
EN

Stack Overflow用户

发布于 2017-04-28 07:57:31

如果这些值不是特定于环境的(即dev,qa,stage特定的),并且在代码的整个生命周期中不发生变化,则在代码中将它们声明为静态最终值。

常量的缺点是,如果对常量做了一些更改,则需要重新编译它们,这在属性中不是这样,但如果是常量,则根本不应该更改。

例如:-在dev/qa/prod/prod环境中,您可能有不同的用户名"admin“凭据。

然后,您可以像public static final String userId="admin"一样定义管理用户,但是要从属性文件中提供密码,并根据运行代码的环境对其进行更改。

喜欢

dev.properties admin.password = 123456. qa.properties admin.password = abcdef.

然后根据您的环境从属性文件中读取这些密码。

票数 5
EN

Stack Overflow用户

发布于 2017-04-28 08:03:34

真正的答案取决于你的需求。在现实世界中,没有"A比B更好“。只是:“给定要求x、y、z比B更有帮助”。

因此,您只需考虑这两种方法的优缺点,才能决定什么对您“更好”。

使用常量的优点:

  • 编译时间安全
  • 编译器首先支持
  • 简单:只有一个常数。属性需要来自文件,它们都是平面字符串,甚至可以是缺少

常量的缺点:

  • 修补程序要求您向客户提供重新编译的类文件。
  • 为了应用be修复,需要停止运行代码的JVM;或者至少需要重新部署容器(就像Tomcat中的WAR )。

属性只是“相反的方式”。

换句话说:如果您愿意,您可以编写许多复杂的代码,允许您通过重新读取属性信息来“修补”正在运行的应用程序。通过这样做,您可以通过提供一个新的属性文件并触发应用程序中的一些“重读属性”挂钩来修补正在运行的应用程序。但毫无疑问:实现正确、可靠的方法是hard

但是,除非上面的特性对您来说是真正的值,否则使用普通编译时常量可能会更好。您可以看到,“部署更新”是将文件提供给客户。这些文件中的大部分都是类文件或属性文件并不重要(当我们不是在讨论“热修复”要求时)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43674996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档