java中的常量vs属性

时间:2017-04-28 07:55:44

标签: java properties constants

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

在.properties文件中声明常量值或在不同的类中将该值声明为静态final是最好的方法吗?

5 个答案:

答案 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”。

因此,您只需考虑两种方法的优点/缺点,以便决定什么是“更好”的。

使用常量的优点:

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

常数的缺点:

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

属性只是“反过来”。

换句话说:如果你愿意,你可以编写很多复杂的代码,允许你通过重新读取属性信息来“修补”正在运行的应用程序。 通过这样做,您可以通过提供新的属性文件并在应用程序内触发一些“重新读取属性”挂钩,使您的客户修补正在运行的应用程序。但不要搞错:实施正确,可靠的方法很难

但除非上述功能具有真正的值,否则您最有可能使用普通的编译时常量。您会看到,“部署更新”是指向客户提供文件。这些文件中的大部分是类文件或属性文件并不重要(当我们不讨论“修补程序”要求时)。

答案 3 :(得分:0)

我尝试了两种方式 - 文件和公共静态最终类,两者都有效。有些要点需要注意:

  • 如果您的程序需要由希望更改这些常量的各方测试/运行,则在文件中声明将特别有利。在这种情况下,这些将被称为App / program的属性。 Spring遵循这种方法进行配置。
  • 在课堂上声明它们会保证一次又一次地重新构建应用程序,但如果这些常量不变或不需要被多方访问,您可以非常轻松地选择静态最终类方法。 Android在R.java文件中声明了动态生成的常量作为示例。 顺便提一下,这种方法可以控制你的手。 3rs使用您的代码的各方将无法更改这些常量。 文件方法将控制权传递给其他人&#39;为改变它们而动手。

Object Mappers也希望你在配置文件中有Bean属性,但在Java Annotation中,它们位于两者之间,并且优雅地解决它。

答案 4 :(得分:0)

还有第三种选择:系统属性。它们可以在用于启动程序的命令行中定义,也可以使用常量来轻松访问它们并提供默认值。

示例:

public static final String HOSTNAME = System.getProperty("my.host-name", "localhost");

虽然提供默认值并不总是一个好主意。

话虽如此,您选择的方法取决于问题的答案:是程序的值部分,还是程序安装的上下文的一部分。