【发布时间】:2010-08-01 12:13:26
【问题描述】:
我使用了大约 1000 个与特定 java.util.Properties 相关联的属性,这些属性由文件支持。该文件的主要原因是在不重新编译程序的情况下更改它们,并允许用户根据自己的喜好进行调整。 有些属性只在代码中的一处使用,但也有一些属性在不同的代码段甚至不同的类中使用了多次。
我最近养成了声明所有用作字符串常量的属性的习惯,通常在这样的单独接口中:
public interface AnimalConstants {
public static final String WEIGHT_PROPERTY = "weight";
public static final String RUNNING_SPEED_PROPERTY = "speedInKph";
public static final String HOURS_OF_SLEEP_A_DAY_PROPERTY = "sleepHrs";
...
}
当一个类需要访问一些动物属性时,我只需实现这个接口,就可以访问所有声明的属性常量。当我需要一个特定的属性时,我只使用相应的常量,而不考虑它的确切名称(因为经常使用缩写),更重要的是,通过这种方式消除了错误输入属性名称的风险。另一个优点是,如果我稍后选择重命名属性以使配置这些属性的高级用户更清楚),我只需要在声明该属性常量的界面中更改该名称(当然还有属性文件),因此无需“搜索和替换”整个项目。最后,我可以轻松检查该属性是否正在使用;我只是评论一下,编译代码,看看有没有错误。
然而,尽管有所有这些优点,但我很好奇这种方法的缺点是什么。我最感兴趣的是以下几点:
- 这种方法(1000 个字符串常量)对字符串池有什么影响?还是在我访问这些常量时按需创建它们?这是否会阻止其他字符串缓存在字符串池中?
- 与我使用硬编码字符串常量的方法相比,这种方法的性能成本是多少,是否相同(忽略访问字段的成本)?字符串池的行为是相似还是有很大不同?
- 这种方法平均增加了多少内存,所有这些字符串常量是否一直保存在内存中?
欢迎任何好的评论/观察。
【问题讨论】:
-
我真的看不出这比让你的代码到处都是文字的性能要差。
-
哦,不要再使用常量接口了。创建接口不是为了用作常量持有者,它们是为合同而创建的。您可以使用类来保存常量。
-
是的,接口不应该用于常量。将他们归入自己的班级;然后,您可以使用静态导入来导入它们,这样您在使用它们时就不需要限定它们。
-
所以如果我只使用类而不是接口并没有真正的缺点,对吧?
-
我建议,更好的方法是将属性名称放入 Java
enum。这样您就不会意外使用不相关的字符串作为属性名称。 Enum 的内存占用会比直接 String 常量稍高,但是,嘿,现在不是 1974 年,而且内存很便宜。另一方面,维护和调试与以往一样昂贵。
标签: java performance string properties constants