Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中跨多个类共享常量字符串?_Java_String - Fatal编程技术网

在Java中跨多个类共享常量字符串?

在Java中跨多个类共享常量字符串?,java,string,Java,String,我希望在一个地方使用Java常量字符串,并在整个项目(许多类)中使用它们 实现这一目标的推荐方法是什么 您应该创建一个存储所有常量的常量类 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 stati

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


实现这一目标的推荐方法是什么

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

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.
比如projectnamestants.java

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

e、 g

您可以通过以下方式访问它:

MyAppConstants.MY_CONST
常数应为:

  • 公共-以便可以从任何地方访问
  • 静态-无需创建实例
  • 最终-因为它的常量不允许更改
  • 根据Java命名约定,命名应大写,以便易于阅读,并在Java文档中脱颖而出
  • 有些情况下,接口只是用来保存常量,尽管我看不出有任何理由这样做,而且创建一个接口来保存常量也被认为是一种不好的做法,另一种方法是将它保存在类中,这样做更有意义

    例如


    JFrame
    具有
    EXIT\u ON\u CLOSE
    contant,任何子类
    JFrame
    的类都有权访问它,而且保留在
    JFrame
    中而不是
    JComponent
    中也是有意义的,因为并非所有组件都有关闭的选项。

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

    publicstaticfinalstringvariablename=“stringvalue”

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

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

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

    您应该将常量分解为它们所属的组,比如它们最常用的组,并在这些类中将它们定义为公共静态final。在进行过程中,使用定义常量的接口似乎是合适的,但不要急于创建一个包含所有常量的单片接口。这不是一个好的设计。

    在主包(即com.yourcompany)的底部创建一个名为
    常量的类,其中包含所有常量。还要将构造函数设为私有,以便不会从此类创建对象:

    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";
    }
    
    最佳做法是使用

    课堂教学法的问题:

  • 不安全
  • 无名称空间
  • 脆性
  • 请查看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;
        }
    }
    
    枚举可以用作常量

    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.
    

    编辑:您可以将其称为常量。常量\u STRING1

    正如@mprab之前回答的那样,常量应该是
    公共的
    静态的
    最终的
    ,并用大写字母键入

    将它们分组到一个类中有助于您:

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

  • 使它们在编译时具有类型安全性。如果您使用了
    字符串
    s,则可能会将
    “数据库异常”
    “数据库怀疑”
    拼错,并且只在执行过程中注意(如果您幸运并注意到的话)。你也可以从自动完成中获利

  • 帮助您在执行过程中节省内存。您只需要一个常量实例的内存。 例如:(一个真实的例子)如果你在代码中的不同类中有1000次
    字符串
    “DATABASE\u EXCEPTION”,那么它们中的每一个在内存中都是不同的instance

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

  • 添加javadoc注释,这样使用常量的程序员就可以获得有关常量的更多语义信息。当您按下
    CTRL+SPACE
    时,它将显示为工具提示。即:

    /** 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";
    
  • 向常量的标识符添加语义。如果你有常数<代码>“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.
    
    如果将来决定更改常量的值,它将对您有所帮助

    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.
    
  • 在运行时之前,您可能不知道常量的值。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.
      }
    
    }

  • 如果您的constants类太大,或者您认为它将来会增长太多,您可以根据不同的含义(同样是语义)将其划分为不同的类:
    ConstantDB
    ConstantNetwork
    ,等等

  • 缺点:

  • 您团队的所有成员都必须使用相同的类和相同的常量命名法。在大型项目中,找到两种定义并不奇怪:

    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"; 
    
    不同的标识符,用于不同的值,具有相同的含义(并用于相同的目的)

  • 这可能会使可读性变差。做同样的事情必须写更多的东西:

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

  • 常量在类中应该如何排序?按字母顺序所有相关常数一起?按创建/需要的顺序排列?谁应该对订单的正确性负责?任何(足够大的)常量重新排序都会被视为版本控制系统中的一团乱麻

  • 嗯,这比我预期的要长。欢迎任何帮助/批评

    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\u STRING1.toString()

    我想你要找的正确答案是

    import static com.package.YourConstantsClass.*;
    

    一个带有返回常量字符串的静态方法的静态类怎么样?这不是java推荐的设计方法。将常量放在它们相关的类中。@beerbajay但我需要在一些类中使用这些字符串,建议使用什么方法?@Danijel如果按照beerbajay的建议,您仍然可以在不同的类中使用它们。只需将字段设置为静态、公共和最终。这取决于您的特定用例。通常有一个逻辑“主”位置