简体   繁体   中英

Properties or Enums or static final

When it comes to declare predefined constants in a name-value pair, I have been randomly choosing between 'java.util.Properties', 'enums' or a separate class with 'public static final' values.

For future reference, I need some guidelines over which approach to take.

Thanks!

It all depends of your constant lifecycle. Constant are by definition something that do not move. Choosing the right methods will be a question of the likely to change and the repackaging need.

  • If you're really sure, it wont move ever : static final is the way to go. Pi, mathematical constants, things like that are a good example.

  • If you think there is a potential change but need the ease of code manipulation and do not fear of ascendant compatibility, enums is ok. I did that for error code some time ago.

  • If you think there is a potential change but you don't want this change to impact your code, properties (with resource bundle) is the better choice. Labels (translations), inital settings, etc are also a good example.

static final fields are used when you cannot form a definite set of closed options from which you can choose the state of a variable. On the contrary, when you can, you always use enums.

Now, when you want to keep a dictionary of key-values, regardless of their nature, it's time to use a Properties type object or sometimes a Map.

Use Enums when your set of constants are fixed and not expected to change often. If it often changes then its difficult to maintain backward compatibility with your previous versions. If in a client server architecture both have different versions of some Enum. Eg

Server : public enum Priority{ HIGH,LOW,MEDIUM,AVERAGE }

Client : public enum Priority{ HIGH,LOW,MEDIUM}

Let's say if server sends Priority.AVERAGE to client then the client will throw exception.

One more thing to consider - will these Strings change in different versions? ie might you have a French version, a Chinese version, an "advanced" version? If so, Properties / ResourceBundles etc. are the way to go.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM