在我的java程序中声明常量值的最佳方法是什么?
在.properties文件中声明常量值或在不同的类中将该值声明为静态final是最好的方法吗?
答案 0 :(得分:5)
如果这些值不是特定于dev,qa,stage
的环境,并且在代码的整个生命周期内都不会更改,则在代码中将它们声明为静态final。
常量的缺点是你需要重新编译它们,如果你对它们做了一些改变,这在属性中不是这种情况,但如果它是一个常量,它根本不应该改变。
例如: - 您的dev / qa / stage / prod环境中的用户名“admin”可能具有不同的凭据。
然后,您可以定义管理员用户,例如public static final String userId="admin"
,但要从属性文件中提供密码,并根据您运行代码的环境进行更改。
喜欢
dev.properties admin.password = 123456。
qa.properties admin.password = abcdef。
然后根据您的环境从属性文件中读取这些密码。
答案 1 :(得分:5)
问题的答案取决于你想要完成的事情。但也存在误解。
属性文件
属性文件不是替代或替代常量。它们用于存储可配置的值,例如ip,语言等。从文件加载常量会破坏常量的目的。
<强>常量强>
另一点是public static final
变量在java中不是一个好方法,首选方法是使用枚举器。(来自Effective Java, Item 30: Use enums instead of int constatns)。 enum
将强制您以有意义的方式对常量进行分组,而充满随机public
常量的类很难管理。 Enum
使您能够提供功能,例如检查,验证,将常量与多个对象相关联,并且可以在switch
语句中使用。 Enums
也被编译,使它们更有效和类型安全。这本书更详细地解释了enums
的好处。
我认为最好的方法是考虑价值是否会根据某些外部因素而改变,或者它是否始终保持不变。
属性文件和对配置的全局访问
想象一下,您的属性文件中有一个ip,并且您希望能够从代码中的任何位置访问此值。您可以只读取该值并将其加载到公共静态最终变量中。
如果执行此操作,您将如何控制初始化值,或者配置的值是否正确?在这种情况下,您可以使用单例类模式(只能存在该类的一个实例),它加载文件并检查值是否正确。
它可以将值存储在private static final
变量中,并启用可以执行所需检查的getter,以确保该值正确。这使您可以全局访问变量并将逻辑分组到一个位置。
下次向文件添加一个值时,您只需要更新此类,而不需要在代码中搜索它以及检查是否正确。
注意强>
很多人都说没有真正做某事的“最佳方式”。我认为这是真的,但如果您可以从 Joshua Bloch 访问 Effetive Java 这样的书籍,那么您应该阅读它们并向已经编码的人学习很长一段时间。
答案 2 :(得分:2)
真正的答案取决于您的要求。现实世界中没有“A 比B更好”。只有:“A 更有帮助给定要求x,y,z 而不是B”。
因此,您只需考虑两种方法的优点/缺点,以便决定什么是“更好”的。
属性只是“反过来”。
换句话说:如果你愿意,你可以编写很多复杂的代码,允许你通过重新读取属性信息来“修补”正在运行的应用程序。 通过这样做,您可以通过提供新的属性文件并在应用程序内触发一些“重新读取属性”挂钩,使您的客户修补正在运行的应用程序。但不要搞错:实施正确,可靠的方法很难。
但除非上述功能具有真正的值,否则您最有可能使用普通的编译时常量。您会看到,“部署更新”是指向客户提供文件。这些文件中的大部分是类文件或属性文件并不重要(当我们不讨论“修补程序”要求时)。
答案 3 :(得分:0)
我尝试了两种方式 - 文件和公共静态最终类,两者都有效。有些要点需要注意:
Object Mappers也希望你在配置文件中有Bean属性,但在Java Annotation中,它们位于两者之间,并且优雅地解决它。
答案 4 :(得分:0)
还有第三种选择:系统属性。它们可以在用于启动程序的命令行中定义,也可以使用常量来轻松访问它们并提供默认值。
示例:
public static final String HOSTNAME = System.getProperty("my.host-name", "localhost");
虽然提供默认值并不总是一个好主意。
话虽如此,您选择的方法取决于问题的答案:是程序的值部分,还是程序安装的上下文的一部分。