我希望有一些String值可供我/ Java中的应用程序使用。不同的课程需要它们。我想知道在整个应用程序中保持和访问这些值的最佳方法。
我知道的一种方法是在Java中使用Enum模式。我可以将String值与每个枚举关联,然后访问它。就像在这里给出Best way to create enum of strings?
其次是使用String值维护一类常量。
可能的最佳方式是什么,以便遵循良好的设计,并且可以干净地访问所有内容。
我想知道。
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值保存在其他类中。
答案 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)
我会对常量进行分组并使用第二个建议,其中类的名称应该是特定于域的,而不是仅仅是“常量”。考虑一个数据库字段名称池,其中每个类可以表示一个表。如果
,我只会使用这种模式否则,这些值应定义为使用类中的private
常量字段。
另外,我会创建这样的类final
并添加private
构造函数来抛出AssertionError
(否则仍然可以创建这样的常数holer类)。这使得每个用户都清楚这些类永远不应该用于其他东西,而不是它们的常量。我会进一步避免接口,因为它们倾向于实现以允许某种static import
,即使这些常量类并不真正代表实际的域类型。这为您的应用程序增加了一些不必要的冗长。
请注意,String
s(和原语)是编译时常量,并且将由编译器内联。这意味着这些常量holder类永远不会在运行时加载,并且在使用它们时绝对没有性能或内存损失。就像您将String
复制粘贴到它所使用的每个位置一样。因此,良好的分组是最高优先级。这种内联不适用于“字符串枚举”,这就是我不鼓励使用它们的原因。如果你的常量类型比String
更复杂,我会再次考虑enum
,因为它们可以表示接口类型并提供定义这些常量的简洁方法。