Dónde colocar cadenas de teclas i18n en Java

Al hacer la internacionalización en Java, asigna una clave de cadena a cada mensaje. ¿Cuál es la mejor práctica sobre dónde colocar esas teclas de cadena? El objetivo es permitir una fácil refactorización (p. Ej., Cambios de nombre de clave), código limpio y legible, separación de preocupaciones pero aún no duplicación de claves / mensajes, incluso si se llama desde diferentes partes del código.

//bad way, strings directly in code
messages.getString("hello_key");

-

// better way, use String constants
public static final String HELLO_KEY = "hello_key";
...
messages.getString(HELLO_KEY);

-

// other (better?) way, put all keys in one huge central class
public class AllMessageKeys {
  public static final String HELLO_KEY = "hello_key";
  ...
}

public class Foo {
  ...
  messages.getString(AllMessageKeys.HELLO_KEY);
}

-

// other (better?) way, put all keys in neighbor class
public class FooMessageKeys {
  public static final String HELLO_KEY = "hello_key";
}

public class Foo {
  ...
  messages.getString(FooMessageKeys.HELLO_KEY);
}

¿Alguna otra propuesta? ¿Cuál es el mejor? Estoy en Eclipse IDE, si eso aclara la parte de refactorización.

Clarificación: en los ejemplos anteriores, "mensajes" es del tipo ResourceBundle.