Thursday, January 24, 2008

Safer Java: No Pseudo Constants

Even the pros do it: String "constants" i.e. a string literal (that is something between " quotes) used as a "constant".

That's almost as bad as using integer values as arguments instead of defining symbolic names for them! I mean, the values passed into this API are defined by the standard, aren't they? Sure, you can pass additional feature names as well but that doesn't stop anyone from defining those which the standard defines somewhere! So what that not all of them must be supported!

There are several reasons why you should always define string constants when your API need strings as parts of it's "configuration":

  1. It makes it much more simple to find possible values for your API.
  2. Auto completion in an IDE is possible and helps to avoid typos.
  3. You can add JavaDoc to your strings explaining what they do.
  4. Modern IDEs can find out where your strings are being used in the project.
  5. You can rename the constant and change the string value, even if you have several constants with the same value!
  6. Even if the literals are read from a file, still define a constant for the string and map the raw string to the constant as soon as possible. It makes it so much more simple to track!

Tip: If you still use Java 1.4, define your string constants in an interface (without any other methods). That allows you to use "implements" anywhere where you want to use the constant names without having to prefix them with the name of the interface:

public interface Constants {
    public final static String A = "a";
}

class Demo implements Constants {
    private String value = A;
}

With Java 5, you'll use enum, of course (especially because you can then use these "strings" in switch statements.

No comments: