Java 存储一组预定义字符串的主要约定是什么?现在我有一个包含我使用的所有字符串的类,但感觉肯定有更好的方法来做到这一点。
这就是我在 my_strings.java 类中所做的
public final static String s1 = "test";
public final static String s2 = "test2";
...
Java 存储一组预定义字符串的主要约定是什么?现在我有一个包含我使用的所有字符串的类,但感觉肯定有更好的方法来做到这一点。
这就是我在 my_strings.java 类中所做的
public final static String s1 = "test";
public final static String s2 = "test2";
...
您可以使用资源包。创建一个名为messages.properties
in的文件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 自动执行此操作(尽管以更复杂的方式)
有两种方法。如果它们是相关的,或者它们指定了一个概念,则可以使用enum
. 否则,要走的路是使用ResourceBundle
文件.properties
。我也会给这些字符串起合理的名称,而不是s1
, 或s2
。
static final
根据定义,变量实际上是常量,因为它们的值保持不变,此后无法更改。
我假设你my_strings.java
是一个具体的类而不是一个接口 - 为什么接口是一个坏主意?阅读Joshua Bloch on Constant Interface Anti-Pattern
推荐的方法是通过查看哪些类使用这些常量来确定常量的上下文?
如果单个类使用常量 - 将常量放在该特定类中并使其私有。
如果一个常量被多个类使用,但它们都以分层方式从另一个类继承,则将该常量放在层次结构中最顶层的类中并使其受到保护。因此,所有子类都可以访问它。
如果一个常量被多个类使用,并且它们都没有通过继承层次结构链接,而是属于同一个包,则将该常量放在从域角度来看最相关的类中并使其成为包私有(不访问修饰符)
如果一个常量被多个类使用,并且它们都没有通过继承层次结构链接并且属于多个包,则将该常量放在从域角度来看最相关的类中并将其公开。
最后,一些通用的有用编码约定:
对类名使用驼峰式大小写,例如:MyStrings.java
对常量使用大写,并使用下划线分隔两个单词'_'
,例如:DEFAULT_VALUE
您可以将 .properties 文件与您的字符串一起使用。这样您就可以处理不同的语言,更改对文件的引用。