Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的常量与属性_Java_Properties_Constants - Fatal编程技术网

java中的常量与属性

java中的常量与属性,java,properties,constants,Java,Properties,Constants,在java程序中声明常量值的最佳方法是什么 在.properties文件中声明常量值或在另一个类中将该值声明为static final本质上是最好的方法吗?如果这些值不是特定于环境iedev、qa、stage的,并且在代码的整个生命周期中不会更改,则在代码中声明它们为static final 常量的缺点是,如果您对它们进行了一些更改,则需要重新编译它们。属性中的情况不会如此,但如果它是常量,则根本不应该更改 例如:-在dev/qa/stage/prod环境中,用户名“admin”可能有不同的凭据

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


在.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");