在Java中跨许多类共享常量string?

我想在一个地方使用Java常量string,并在整个项目(很多类)中使用它们。

推荐的方法是什么?

 public static final String CONSTANT_STRING="CONSTANT_STRING"; 

常数应该是:

  1. 公开 – 这样就可以从任何地方访问它
  2. 静态 – 无需创build实例
  3. 最后 – 因为它的常数不能改变
  4. 按照Java命名约定应该大写,以便在Java文档中易于阅读和脱颖而出。

有些接口只是用来保持常量,虽然我没有看到任何理由这样做,也被认为是一个不好的做法,创造一个接口来保持常量,另一种方法是保持在它使更多的类感。

例如

JFrame具有EXIT_ON_CLOSE常量,任何JFrame子类都可以访问它,保留JFrame而不是JComponent也是有意义的,因为并不是所有的组件都有closures的选项。

你应该创build一个存储所有常量的常量类。

像ProjectNameConstants.java

其中包含所有常量string静态,因为您可以通过类名来访问它。

例如

 classname : MyAppConstants.java public static final String MY_CONST="my const string val"; 

你可以像访问它一样

 MyAppConstants.MY_CONST 

正如@mprabhat之前回答的那样,常量应该是publicstaticfinal ,并且用大写字母来input。

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

  1. 不需要知道你所有的常量。 许多IDE(如Eclipse)向您显示一个类所有的字段列表。 所以你只需按CTRL+SPACE就可以知道你可以使用哪些常量。

  2. 在编译时使它们变为安全types。 如果你使用了String ,你可能会拼错"DATABASE_EXCEPTION""DATABSE_EXSCEPTION" ,只有在执行时注意(如果你幸运的话,注意到它)。 您也可以利用自动完成function。

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

您可能还有其他一些考虑因素:

  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"; 
  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:你可以从configuration文件中读取它们。

     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. 如果你的常量类太大,或者你认为将来它会增长太多,你可以把它分成不同的类来表示不同的含义(再次,语义): ConstantDBConstantNetwork

缺点:

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

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

    分开数百行或不同的常量类。 甚至更糟糕的是:

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

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

  2. 这可能会使可读性变差。 不得不写更多的做同样的事情:

     if ("Y".equals(getOptionSelected()) { 

    VS

     if (ConstantsWebForm.YES.equals(getOptionSeleted()) { 
  3. 常量是如何在课堂上sorting的? 按字母顺序? 所有相关的常量在一起? 为了创build/需要它们? 谁应该对订单负责? 任何(足够大的)重新sorting的常量在版本系统中都会被视为一团糟。

那么,它比我预期的要长。 任何帮助/评论家都欢迎。

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

课堂教学的问题:

  1. 不是types安全的
  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; } } 

枚举可以用作常量。

编辑:你可以调用这个Constants.CONSTANT_STRING1

 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() { } } 

那么就不可能实例化这个类。

在你的主包(即com.yourcompany)的基础上创build一个名为Constants的类,并在其中包含所有常量。 另外使构造函数是私有的,所以不会从这个类创build对象:

 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"; } 

你应该把你的常量分成它们属于的组,并且将它们定义为public static final。 当你走的时候,看起来合适的是有定义你的常量的接口,但是抵制创build一个包含所有常量的单一接口的冲动。 这只是不好的devise。

创build一个公共class并为每个常量string创build一个像这样的字段

public static final String variableName = "string value";

 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()