全局保持String类型值的更好方法?

时间:2014-02-08 16:29:47

标签: java design-patterns enums constants

我希望有一些String值可供我/ Java中的应用程序使用。不同的课程需要它们。我想知道在整个应用程序中保持和访问这些值的最佳方法。

  1. 我知道的一种方法是在Java中使用Enum模式。我可以将String值与每个枚举关联,然后访问它。就像在这里给出Best way to create enum of strings?

  2. 其次是使用String值维护一类常量。

  3. 可能的最佳方式是什么,以便遵循良好的设计,并且可以干净地访问所有内容。

    我想知道。

    public class StringValues
    {
       public static final String ONE = "one";
       public static final String TWO = "two";
    }
    

    我正在添加更多细节。

    我将使用这些短名称字符串创建数据库查询。因此,在实例化数据库时,我将在一个地方使用所有字符串,并将创建查询

    但是在查询创建之后,我将需要特定类的字符串池的片段/部分,以便我可以为所选类注册监听器而不是池中的所有字符串。每个类都应该知道它只需要1-2个字符串名称来注册运行时监听器而不是所有的String名称。

    我一次需要所有字符串(在应用程序开始时),然后我只需要2或3个或更多,但不是全部。

    以下是让您了解我的确切设计问题的代码。

    /**
    *This class will be used to create Views in Database.
    */
    class Views
    {
        public static final String BY_NAME = "byName";
        public static final String BY_DATE = "byDate";
        public static final String BY_GENDER = "byGender";
    
        //For every String I am going to create Views in Couchbase.
    }
    
    /**
    *This class knows to which Views it needs to listen to. If any change in its views occurs then
    * it will take action. In case of byDate change it is intended to take an action.
    */
    public class NewestMember
    {
        String[] viewsToQueryFor = {"byDate"};
    
        //This class will call only these views and will register for them.
    }
    
    
    public class Male
    {
        String[] viewsToQueryFor = {"byName", "byGender"};
    
        //This class will call only these views and will register for them.
    }
    
    
    public class Female
    {
        String[] viewsToQueryFor = {"byName", "byGender"};
    
        //This class will call only these views and will register for them.
    }
    

    我不想这样做。为此,我将String值保存在其他类中。

3 个答案:

答案 0 :(得分:4)

第二个很好。但我不会创建一个包含所有不相关常量的类。这不规模,并不自然。相反,在类中定义它们所属的常量。例如:

public class Victim {
    public static class DEFAULT_MALE_NAME = "John Doe";
    public static class DEFAULT_FEMALE_NAME = "Jane Doe";
    ...
}

public class CreditCard {
    public static final String DEFAULT_TYPE = "Visa";
    ...
}

编辑:

既然您提供了一些代码,那么您实际上应该定义一个或多个枚举,这些枚举将封装应用于给定集合的View的概念。

答案 1 :(得分:2)

由于以后无法扩展枚举,最好的方法是使用常量,即public static final

答案 2 :(得分:1)

我会对常量进行分组并使用第二个建议,其中类的名称应该是特定于域的,而不是仅仅是“常量”。考虑一个数据库字段名称池,其中每个类可以表示一个表。如果

,我只会使用这种模式
  1. 我需要很多这样的值,以便我更喜欢分组。
  2. 这些值在我的应用程序的几个部分中使用,我不想重复它们以避免错误的错误。
  3. 否则,这些值应定义为使用类中的private常量字段。

    另外,我会创建这样的类final并添加private构造函数来抛出AssertionError(否则仍然可以创建这样的常数holer类)。这使得每个用户都清楚这些类永远不应该用于其他东西,而不是它们的常量。我会进一步避免接口,因为它们倾向于实现以允许某种static import,即使这些常量类并不真正代表实际的域类型。这为您的应用程序增加了一些不必要的冗长。

    请注意,String s(和原语)是编译时常量,并且将由编译器内联。这意味着这些常量holder类永远不会在运行时加载,并且在使用它们时绝对没有性能或内存损失。就像您将String复制粘贴到它所使用的每个位置一样。因此,良好的分组是最高优先级。这种内联不适用于“字符串枚举”,这就是我不鼓励使用它们的原因。如果你的常量类型比String更复杂,我会再次考虑enum,因为它们可以表示接口类型并提供定义这些常量的简洁方法。