用于存储所有已定义字符串的Java约定

时间:2013-07-15 20:33:25

标签: java convention

Java用于存储预定义字符串集的主要约定是什么?现在我有一个包含我使用的所有字符串的类,但感觉就像是一个更好的方法来做到这一点。

这就是我在my_strings.java类中所做的事情

public final static String s1 = "test";
public final static String s2 = "test2";
...

4 个答案:

答案 0 :(得分:9)

您可以使用资源包。在messages.properties中创建一个名为src的文件或与所需包对应的子目录,并按以下方式向其中添加字符串。不需要引用。

ClassThatUsesAString.stringName=foo
AnotherClass.stringName=bar
AnotherClass.anotherString=baz

然后您可以按如下方式访问这些字符串:

ResourceBundle rsrc = ResourceBundle.getBundle("messages");

然后:

rsrc.getString(stringName);

例如,如果FooClass需要字符串quxString,则添加到messages.properties:

FooClass.quxString=waldo was here

注意缺少报价。现在抓住它:

rsrc.getString("FooClass.quxString");

这不会强制执行类边界,并且只是为了方便而使用类进行命名。

如果字符串紧密相关,则枚举可能更好,可以直接使用,也可以为不同的本地化指定消息名称(即枚举包含“ECONNREFUSED”和“ECONNABORTED”,并且映射到“连接被拒绝”和“连接已中止” “在一个捆绑和”conexiónrechazada“/”Conexiónabortada“在另一个捆绑

Eclipse用户:Eclipse使用Source→Externalize Strings自动执行此操作(但以更复杂的方式)

答案 1 :(得分:1)

有两种方法。如果它们相关,或者它们指定了概念,则可以使用enum。否则,要走的路是将ResourceBundle.properties文件一起使用。我也会给这些字符串提供合理的名称,而不是s1s2

答案 2 :(得分:1)

根据定义,

static final变量实际上是常量,因为它们的值保持不变,之后无法更改。

我认为你的my_strings.java是一个具体的类,而不是一个接口 - 为什么界面是个坏主意?在Constant Interface Anti-Pattern

上阅读Joshua Bloch

建议的方法是通过查看哪些类使用这些常量来确定常量的上下文

  1. 如果单个类使用常量 - 将常量放在该特定类中并将其设为私有。

  2. 如果一个常量被多个类使用但它们都以分层方式相互继承,那么将常量放在层次结构中的最顶层类中并使其受到保护。因此,所有儿童课程都可以使用。

  3. 如果一个常量被多个类使用,并且它们都没有通过继承层次结构链接,但属于同一个包,那么将常量放在一个与域透视图最相关的类中它是package-private(无访问修饰符)

  4. 如果一个常量被多个类使用,并且它们都没有通过继承层次结构链接并且属于多个包,那么将常量放在一个与域透视图最相关的类中并将其设置为公共

  5. 最后,一些通用的有用编码约定:

    1. 对类名使用驼峰大小写,例如:MyStrings.java

    2. 对常量使用大写,并使用下划线'_'分隔两个单词,例如:DEFAULT_VALUE

答案 3 :(得分:0)

您可以在字符串中使用.properties文件。这样你就可以处理不同的语言,改变对文件的引用。