我已经在几个地方读过这篇文章,并且我的老年人一直在java中使用String Constants。所以我通常在我的StringConstants
类中保留所有日志消息和其他必需的字符串内容,这看起来像这样:
public class StringConstants {
// Logger Messages
// Debug
public static final String DEBUG_ENTERING_METHOD = "Entering Method";
public static final String DEBUG_LEAVING_METHOD = "Leaving Method";
}
我是否还应保留特殊字符/符号/操作符,例如':',','或者' ='在这个文件中作为最终字符串?
我问这个是因为我知道如果它们在内存中,则不会一次又一次地创建字符串对象。所以,如果我必须做像
这样的事情logger.error(StringConstants.ERROR_MSG+":"+some_string);
冒号应该是字符串常量吗?它对我有用吗?
如果我的疑问或疑问不明确,请在评论中提及,我会编辑问题。
答案 0 :(得分:1)
IMO,常量应定义在何处使用。如果它们在一个类中使用,则在该类中定义它们。如果它们在一个包中使用,请在该包中的类中定义它们。在最合乎逻辑的地方定义它们,而不是任意地在一个地方。
如果你使用冒号作为分隔符,也许你想要一个常量,因为当你引用它时它可能会使它的目的更清晰。但是,仅仅为了打印日志消息而定义常量是相当愚蠢的,因为它们的确切格式无关紧要。并且具有相同值的所有String文字引用相同的对象,因此
final String STRING = "string";
System.out.println(STRING);
System.out.println(STRING);
...与
基本相同System.out.println("string");
System.out.println("string");
两者都只创建一个字符串。
顺便说一下,这个
logger.error("a" + "b" + "c");
...可以创建五个字符串(“a”,“b”,“c”,“ab”和“abc”)虽然我认为编译器可能会识别出你是什么做和优化它。也许对编译器有更多了解的人可以对此有所了解。在任何情况下,除非您能证明性能是一个问题,否则不要担心微优化。你会付出很多努力,用户永远不会注意到你在几毫秒内完成了削减。
答案 1 :(得分:1)
最好使用属性文件而不是类或接口,以保存用于消息的字符串。您甚至可以将属性文件保留在具有Java代码的jar之外。有一些优点。
如果要更改消息的文本,或者为不同的语言设置不同的版本,可以只放置一个新的属性文件,而不需要重建jar文件。
如果正确使用PropertyResourceBundle
类,国际化会自动发生 - 您可以将不同的属性集共存,系统的区域设置将用于选择正确的属性。
Logger
类与ResourceBundle
无缝集成,因此您无需编写任何代码来查找消息密钥。
Logger
类允许您使用包含消息参数(例如{0}, {1}
)并使用您提供的参数展开它们。甚至还有一些格式化选项。因此,在您的问题示例中,您可能拥有一个值为Entering method {0} of class {1}
的属性,只需写入logger.log(Level.FINE, "entering", "methodname", "classname");
,其中“输入”是属性文件中的键。那么就没有必要弄乱StringBuilder
个对象,或String.format
,或任何其他消息连接机制。
有一些日志框架可以提供比这更好的东西,但是这个主题太大了。我的观点是,使用属性文件和资源包会给你很多,没有任何东西;因此,甚至不需要考虑为常量设置类或接口。