1

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

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

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

4 回答 4

9

您可以使用资源包。创建一个名为messages.propertiesin的文件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ón rechazada”/“Conexión abortada”

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

于 2013-07-15T20:37:03.740 回答
1

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

于 2013-07-15T20:37:11.197 回答
1

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

我假设你my_strings.java是一个具体的类而不是一个接口 - 为什么接口是一个坏主意?阅读Joshua Bloch on Constant Interface Anti-Pattern

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

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

  2. 如果一个常量被多个类使用,但它们都以分层方式从另一个类继承,则将该常量放在层次结构中最顶层的类中并使其受到保护。因此,所有子类都可以访问它。

  3. 如果一个常量被多个类使用,并且它们都没有通过继承层次结构链接,而是属于同一个包,则将该常量放在从域角度来看最相关的类中并使其成为包私有(不访问修饰符)

  4. 如果一个常量被多个类使用,并且它们都没有通过继承层次结构链接并且属于多个包,则将该常量放在从域角度来看最相关的类中并将其公开。

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

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

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

于 2013-07-15T21:41:05.390 回答
0

您可以将 .properties 文件与您的字符串一起使用。这样您就可以处理不同的语言,更改对文件的引用。

于 2013-07-15T20:37:15.380 回答