Properties file vs Constants class in Java
Use hardwired constants in your Java code when you don't want users / deployers / testers / tests changing them.
Use a properties file when you do want this to be a possibility.
The point is that changing a hard-wired constant in your application's source code entails editing the source code, rebuilding and redeploying. By contrast, changing a properties file may be as simple as firing up NotePad.
You commented:
As you said that changing properties file is simple whereas changing constants file requires us to rebuild the application. So, shouldn't we always prefer to use properties file?
No. Not always. For example, if you distribute your application to end users to install on their machines and it has constants that you do not want users to change it would be a bad idea to put them in a properties file.
It is impossible to reduce this to "always prefer X" recommendation. You need to understand your own application requirements and decide for yourself.
Generally, anything in a constants class is considered to be "hardcoded"; that is, you are required to re-compile to make changes.
Use a .properties
file for things like configuration, where you don't have to be forced to re-compile just to make changes. In this way, you can simply change the properties file and restart your application.
Constants - when you don't mind re-compiling the application each time you change value. Sort of an irony here. Why would you change something if it has been called a constant :)
Properties file - when you want the luxury of just changing the value and maybe restarting the application to pick up the change.
My check list
Property file:
Is it configurable per environemnt etc.
Messages, labels etc.
Applicable to particular situation (list of states for rules etc). key-value pairs. Can be modified by someone other than developer ie, analysts, business users etc.
Constant:
Are constants. Not configurable. Mostly for optimization and reuse. To avoid keys being scattered.
For constants like YES = "yes". Not really a key value. Keys for cache etc.
Constants to ensure that retrieval and set use the same key even though from different places in the application, EXAMPLE xyz.put(KeyConstants.SOME_KEY, "somevalue"); xyz.get(KeyConstants.SOME_KEY) from different classes, ofcouse xyz being shared or singleton.