在许多类中共享Java中的常量字符串?

Dan*_*jel 47 java string

我想在一个地方拥有Java常量字符串,并在整个项目中使用它们(许多类).

推荐的方法是什么?

mpr*_*hat 46

public static final String CONSTANT_STRING="CONSTANT_STRING";
Run Code Online (Sandbox Code Playgroud)

常数应该是:

  1. 公共 - 以便可以从任何地方访问它
  2. static - 无需创建实例
  3. 最后 - 因为它的常数不应该被允许改变
  4. 根据Java命名约定,应该大写,以便易于阅读并在Java文档中脱颖而出.

有些情况下接口仅用于保持常量,虽然我没有看到任何理由这样做,并且创建一个接口来保持常量也被认为是一种不好的做法,另一种方法是将它保留在更多的接口中感.

例如

JFrameEXIT_ON_CLOSE含量的不同,它的子类的任何类JFrame将有机会获得它,它也是情理之中的保持JFrame,而不是在JComponent不所有组件都将被关闭的选项.

  • +1为一个好的答案.为此目的使用接口被认为是不好的做法,应该提到 (8认同)
  • 接口是使用它们的契约只是为了保持常量没有意义 (4认同)
  • @Jimmy:为什么使用接口是一种不好的做法?? (2认同)

J.A*_*.L. 21

正如@mprabhat之前回答的那样,常量应该是public,staticfinal,并用大写字母输入.

在课堂上将它们分组可以帮助您:

  1. 不需要知道你拥有的所有常数.许多IDE(如Eclipse)向您显示类所有字段的列表.因此,您只需按下CTRL+SPACE并获得可以使用的常量的线索.

  2. 在编译时使它们类型安全.如果您使用的StringS,你可能拼错"DATABASE_EXCEPTION""DATABSE_EXSCEPTION",并在执行过程中只注意到(如果你是幸运的,并在所有注意到它).您还可以从自动完成中获利.

  3. 帮助您在执行期间节省内存.你只需要1个常量实例的内存.IE :(一个真实的例子)如果你String在代码中的不同类中有"DATABASE_EXCEPTION"1000次,那么它们中的每一个都将是内存中不同的实例.

您可能有的其他一些注意事项:

  1. 添加javadoc注释,因此使用常量的程序员可以在常量上获得更多语义信息.按下时显示为工具提示CTRL+SPACE.IE:

    /** Indicates an exception during data retrieving, not during connection. */
    public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
    /** Indicates an exception during the connection to a database. */
    public static final String DATABASE_CONNECTION_EXCEPTION =" DATABASE_CONNECTION_EXCEPTION";
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将语义添加到常量的标识符.如果你有常数"Y",有时意味着和其他年份,请考虑使用2个不同的常数.

    public static final String Y = "Y"; // Bad
    public static final String YEAR = "Y";
    public static final String YES = "Y"; 
    
    Run Code Online (Sandbox Code Playgroud)

    如果将来决定更改常量的值,它将对您有所帮助.

    /** Year symbol, used for date formatters. */
    public static final String YEAR = "A"; // Year is Año, in Spanish.
    public static final String YES = "S"; // Yes is Sí, in Spanish.
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在运行时之前,您可能不知道常量的值.IE:您可以从配置文件中读取它们.

    public class Constants
    {
      /** Message to be shown to the user if there's any SQL query problem. */
      public static final String DATABASE_EXCEPTION_MESSAGE; // Made with the 2 following ones.
      public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
      public static final String MESSAGE = "MESSAGE";
    
      static {
        DATABASE_EXCEPTION_MESSAGE = DATABASE_EXCEPTION + MESSAGE; // It will be executed only once, during the class's [first] instantiation.
      }
    
    Run Code Online (Sandbox Code Playgroud)

    }

  4. :如果您的常量类是太大,或者你假设它会在未来的增长太多,你可以在不同类不同的含义(同样,语义)将其划分ConstantDB,ConstantNetwork等等.

缺点:

  1. 团队的所有成员都必须使用相同的类,并对常量使用相同的术语.在一个大型项目中,找到2个定义并不奇怪:

    public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
    public static final String EXCEPTION_DATABASE = "DATABASE_EXCEPTION"; 
    
    Run Code Online (Sandbox Code Playgroud)

    分隔数百行或不同的常数类.甚至更糟:

    /** Indicates an exception during data retrieving, not during connection. */
    public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
    /** Indicates an exception during data retrieving, not during connection. */
    public static final String EXCEPTION_DATABASE = "EXCEPTION_DATABASE"; 
    
    Run Code Online (Sandbox Code Playgroud)

    不同的标识符,对于不同的值,具有相同的含义(并用于相同的目的).

  2. 它可能会使可读性变差.为了做同样的事情,必须写更多:

    if ("Y".equals(getOptionSelected()) {
    
    Run Code Online (Sandbox Code Playgroud)

    VS

    if (ConstantsWebForm.YES.equals(getOptionSeleted()) {
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如何在课堂上订购常数?按字母顺序?所有相关的常数在一起?为了创建/需要它们?谁应该对订单的正确性负责?任何(足够大的)常量重新排序都会被视为版本控制系统中的混乱.

嗯,这比我预期的要长.欢迎任何帮助/评论家.


Hem*_*lia 17

您应该创建一个存储所有常量的常量类.

像ProjectNameConstants.java

它包含所有常量字符串静态,因为您可以通过类名访问它.

例如

classname :  MyAppConstants.java

public static final String MY_CONST="my const string val";
Run Code Online (Sandbox Code Playgroud)

你可以访问它

MyAppConstants.MY_CONST
Run Code Online (Sandbox Code Playgroud)

  • 要么是你要么将它定义为负责该字符串的对象中的"公共静态最终字符串" (2认同)

ami*_*ngh 7

最佳实践是使用Java Enum(After Java 5之后)

课堂方法的问题:

  1. 不是类型安全的
  2. 没有命名空间
  3. 脆性

请检查java文档.

public enum Constants {

    CONSTANT_STRING1("CONSTANT_VALUE1"), 
    CONSTANT_STRING2("CONSTANT_VALUE2"), 
    CONSTANT_STRING3("CONSTANT_VALUE3");

    private String constants;

    private Constants(String cons) {
        this.constants = cons;
    }
}
Run Code Online (Sandbox Code Playgroud)

枚举可以用作常量.

编辑:你可以打电话给这个Constants.CONSTANT_STRING1

  • 调用它的方式不是`Constants.CONSTANT_STRING1`,因为它返回类型为`Constants`的东西.你必须把它称为`Constants.CONSTANT_STRING1.toString()`或`Constants.CONSTANT_STRING1.name()`. (3认同)