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

时间:2012-06-05 11:01:22

标签: java string

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

实现此目的的推荐方法是什么?

10 个答案:

答案 0 :(得分:43)

public static final String CONSTANT_STRING="CONSTANT_STRING";

常量应该是:

  1. public - 以便可以从任何地方访问
  2. static - 无需创建实例
  3. final - 因为它的常量不应该被允许改变
  4. 根据Java命名约定,应该大写,以便于阅读并在Java文档中脱颖而出。
  5. 有些情况下接口仅用于保持常量,虽然我没有看到任何理由这样做,并且创建一个接口来保持常量也被认为是一种不好的做法,另一种方法是将它保留在类中它更有意义。

    例如。

    JFrame包含EXIT_ON_CLOSE,任何子类JFrame的类都可以访问它,并且保留在JFrame而不是{{1}中也是有意义的因为并非所有组件都有一个可以关闭的选项。

答案 1 :(得分:21)

正如@mprabhat之前回答的那样,常量应为publicstaticfinal,并以大写字母输入。

将它们分组到一个类中可以帮助您:

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

  2. 在编译时使它们类型安全。如果您使用了String,则可能会将"DATABASE_EXCEPTION""DATABSE_EXSCEPTION"拼错,并且只会在执行期间发出通知(如果您很幸运,请注意它)。您也可以从自动完成中获利。

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

  4. 您可能会有其他一些注意事项:

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

      /** 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";
      
    2. 将语义添加到常量的标识符。如果您有常量"Y",有时意味着而其他时间,请考虑使用2个不同的常量。

      public static final String Y = "Y"; // Bad
      public static final String YEAR = "Y";
      public static final String YES = "Y"; 
      

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

      /** 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.
      
    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.
        }
      

      }

    4. 如果你的常量类太大,或者你认为它将来会变得太多,你可以将它划分为不同的类,用于不同的含义(再次,语义):ConstantDB,{ {1}}等等

    5. 缺点:

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

        ConstantNetwork

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

        public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
        public static final String EXCEPTION_DATABASE = "DATABASE_EXCEPTION"; 
        

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

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

        /** 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"; 
        

        VS

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

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

答案 2 :(得分:17)

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

喜欢ProjectNameConstants.java

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

e.g。

classname :  MyAppConstants.java

public static final String MY_CONST="my const string val";

您可以将其作为

进行访问
MyAppConstants.MY_CONST

答案 3 :(得分:7)

最佳做法是使用 Java Enum (After Java 5)

班级方法的问题:

  1. 非类型安全
  2. 无名称空间
  3. 脆性
  4. 请查看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;
        }
    }
    

    枚举可以用作常量。

    修改:您可以调用此Constants.CONSTANT_STRING1

答案 4 :(得分:3)

public class SomeClass {
    public static final String MY_CONST = "Some Value";
}

如果它应该是纯常量类,那么也可以将构造函数设为私有。

public class Constants {
    public static final String CONST_1 = "Value 1";
    public static final int CONST_2 = 754;

    private Constants() {
    }
}

然后就不可能实例化这个类。

答案 5 :(得分:2)

在主包的基础(即com.yourcompany)创建一个名为Constants的类,其中包含所有常量。同时使构造函数为私有,因此不会从此类创建任何对象:

public class Constants {

    private Constants() {
        // No need to create Constants objects
    }

    public static final String CONSTANT_ONE = "VALUE_CONSTANT_ONE";
    public static final String CONSTANT_TWO = "VALUE_CONSTANT_TWO";
}

答案 6 :(得分:1)

您应该将常量分解为它们所属的组,例如它们最常用的位置,并在这些类中将它们定义为公共静态final。随着你的进展,拥有定义你的常量的接口似乎是合适的,但却不愿意创建一个包含所有常量的单片接口。这不是好设计。

答案 7 :(得分:0)

创建一个公共class,并为每个常量字符串创建一个这样的字段

public static final String variableName = "string value";

答案 8 :(得分:0)

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;
}
    @JsonValue
@Override
public String toString() {
    return constants;
}

}

使用它Constants.CONSTANT_STRING1.toString()

答案 9 :(得分:0)

我想你正在寻找的正确答案是

import static com.package.YourConstantsClass.*;