我们正在为Jaxen(Java的XPath库)实现一个适配器,该适配器允许我们使用XPath来访问应用程序的数据模型。
这是通过实现将字符串(从Jaxen传递给我们的)映射到数据模型的元素的类来完成的。我们估计我们将需要大约100个类,总共超过1000个字符串比较。
我认为,执行此操作的最佳方法是将字符串直接写入代码的简单if / else语句-而不是将每个字符串都定义为常量。例如:
public Object getNode(String name) {
if ("name".equals(name)) {
return contact.getFullName();
} else if ("title".equals(name)) {
return contact.getTitle();
} else if ("first_name".equals(name)) {
return contact.getFirstName();
} else if ("last_name".equals(name)) {
return contact.getLastName();
...
但是,总是有人告诉我,我们不应该将字符串值直接嵌入代码中,而应该创建字符串常量。看起来像这样:
private static final String NAME = "name";
private static final String TITLE = "title";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
public Object getNode(String name) {
if (NAME.equals(name)) {
return contact.getFullName();
} else if (TITLE.equals(name)) {
return contact.getTitle();
} else if (FIRST_NAME.equals(name)) {
return contact.getFirstName();
} else if (LAST_NAME.equals(name)) {
return contact.getLastName();
...
在这种情况下,我认为这是个坏主意。在该getNode()
方法中,该常数将仅使用一次。直接使用字符串与使用常量一样容易阅读和理解,并节省了我们编写至少一千行代码的时间。
那么,是否有任何理由一次定义字符串常量?还是直接使用字符串是否可以接受?
PS。在有人建议使用枚举代替之前,我们对它进行了原型设计,但是枚举转换比简单的字符串比较要慢15倍,因此我们不予考虑。
结论: 下面的答案扩展了这个问题的范围,不仅仅是字符串常量,所以我有两个结论:
- 在这种情况下,直接使用字符串而不是字符串常量可能是可以的,但是
- 有一些方法可以避免使用字符串,这可能更好。
因此,我将尝试完全避免使用字符串的包装技术。不幸的是,我们还不能使用字符串切换语句,因为我们还没有使用Java 7。但最终,我认为对我们来说最好的答案是尝试每种技术并评估其性能。现实情况是,如果一种技术明显更快,那么我们可能会选择它,而不管它的美观或遵循惯例如何。
switch
标签。使用开关而不是if
级联。