java中的常量与属性
在java程序中声明常量值的最佳方法是什么java中的常量与属性,java,properties,constants,Java,Properties,Constants,在java程序中声明常量值的最佳方法是什么 在.properties文件中声明常量值或在另一个类中将该值声明为static final本质上是最好的方法吗?如果这些值不是特定于环境iedev、qa、stage的,并且在代码的整个生命周期中不会更改,则在代码中声明它们为static final 常量的缺点是,如果您对它们进行了一些更改,则需要重新编译它们。属性中的情况不会如此,但如果它是常量,则根本不应该更改 例如:-在dev/qa/stage/prod环境中,用户名“admin”可能有不同的凭据
在.properties文件中声明常量值或在另一个类中将该值声明为static final本质上是最好的方法吗?如果这些值不是特定于环境ie
dev、qa、stage
的,并且在代码的整个生命周期中不会更改,则在代码中声明它们为static final
常量的缺点是,如果您对它们进行了一些更改,则需要重新编译它们。属性中的情况不会如此,但如果它是常量,则根本不应该更改
例如:-在dev/qa/stage/prod环境中,用户名“admin”可能有不同的凭据
然后,您可以定义管理员用户,如public static final String userId=“admin”
但您要从属性文件中提供密码,并根据运行代码的环境进行更改
像
dev.propertiesadmin.password=123456
qa.propertiesadmin.password=abcdef
然后根据您的环境从属性文件中读取这些密码。真正的答案取决于您的要求。现实世界中没有“A比B好”的说法。仅:“给定要求x、y、z,A比B更有帮助” 因此,你必须考虑两种方法的优缺点,以决定什么是“更好”的。p> 使用常数的优点:
- 编译时安全
- 首先是编译器支持
- 简单性:只有一个常数。属性需要来自文件,它们都是平面字符串,甚至可能丢失
- 错误修复要求您向客户提供重新编译的类文件
- 为了应用错误修复,需要停止运行代码的JVM;或者至少您的容器(如Tomcat中的战争)需要重新部署李>
但是,除非上述特性对您来说是真正的,否则最好使用普通编译时常量。您知道,“部署更新”是指将文件提供给客户。这些文件中有很多是类文件或属性文件并不重要(当我们不讨论“热修复”要求时)。我已经尝试了这两种方法-文件和公共静态最终类,两者都有效。但需要注意的是:
- 如果您的程序需要由希望更改这些常量的各方测试/运行,则在文件中声明将特别有利。在这种情况下,这些将被称为应用程序/程序的属性。Spring在配置时遵循这种方法
- 在类中声明它们将保证一次又一次地重新构建应用程序,但如果这些常量不变或不需要多方访问,您可以很容易地选择静态最终类方法。例如,Android声明在R.java文件中动态生成的常量。 顺便说一句,这种方法将控制权保留在您手中。使用您的代码的3rs方将无法更改这些常量。 文件方法将控制权传递给其他人,以便对其进行更改
对象映射者也希望您在配置文件中拥有Bean属性,但在Java注释中,Bean属性介于两者之间,并且能够优雅地解决问题。问题的答案取决于您想要完成的任务。但其中也存在误解 属性文件 属性文件不是常量的替代品或替代品。它们用于存储可配置值,如ip、语言等。从文件加载常量会破坏常量的用途 常数 另一点是,
publicstaticfinal
变量在java中不是一个好方法,首选的方法是使用枚举器。enum
将强制您以有意义的方式对常量进行分组,而充满随机public
常量的类很难管理。Enum
允许您提供功能,例如检查、验证、将常量与多个对象关联,并且可以在switch
语句中使用<代码>枚举也被编译,这使它们更高效和更安全。这本书更详细地解释了enums
的好处
我认为最好的方法是考虑价值是否会根据某种外部因素而改变,或者是否永远保持不变。
属性文件和对配置的全局访问
假设您的属性文件中有一个ip,并且希望能够从代码中的任何位置访问该值。您可以读取该值并将其加载到公共静态final变量中
如果执行此操作,您将如何控制值已初始化,或配置的值是否正确?在这种情况下,可以使用singleton类模式(该类只能存在一个实例),加载文件并检查值是否正确
它可以将值存储在私有静态final
变量中,并启用一个getter,该getter可以执行所需的检查以确保值是正确的。这使您可以全局访问variabl
public static final String HOSTNAME = System.getProperty("my.host-name", "localhost");