我们应该在StringConstants文件中保留符号/特殊字符吗



我在很多地方读过它,也在前辈的指导下在java中使用字符串常量。因此,我通常将所有日志消息和其他所需的字符串保存在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";
}

我是否应该在该文件中保留特殊字符/符号/运算符,如":"、"或"="作为最终字符串?

我之所以这么问,是因为我知道如果Strings对象在内存中,它们不会一次又一次地创建。所以如果我必须做一些类似的事情

logger.error(StringConstants.ERROR_MSG+":"+some_string);

冒号应该在字符串常量中吗?这对我有好处吗?

如果我的疑问或疑虑有什么不清楚的地方,请在评论中提及,我会编辑这个问题。

使用属性文件比使用类或接口更好,用于保存用于消息的字符串。您甚至可以将属性文件保存在包含java代码的jar之外。有几个优点。

如果你想更改消息的文本,或者为不同的语言提供不同的版本,你只需放置一个新的属性文件,就不需要重新构建jar文件。

如果正确使用PropertyResourceBundle类,国际化会自动发生——您可以同时拥有不同的属性集,并且系统的区域设置将用于选择正确的属性集。

Logger类与ResourceBundle无缝集成,因此不必编写任何代码来查找消息键。

Logger类允许您使用include消息参数(如{0}, {1}),并使用您提供的参数进行扩展。甚至还有一些格式选项。因此,在您的问题示例中,您可能有一个值为Entering method {0} of class {1}的属性,只需编写logger.log(Level.FINE, "entering", "methodname", "classname");,其中"输入"是属性文件中的键。这样就不需要处理StringBuilder对象、String.format或任何其他消息串联机制。

有一些日志框架可以为您提供比这更多的好处,但这是一个太大的主题,无法在这里深入讨论。我的观点是,使用属性文件和资源捆绑包将免费为您提供很多;因此,甚至没有必要考虑为常量提供一个类或接口。

IMO,常数应该在使用它们的地方定义。如果它们在一个类中使用,请在该类中定义它们。如果它们在一个包中使用,请在该包中的类中定义它们。在最符合逻辑的地方定义它们,而不是在一个地方任意定义。

如果你使用冒号作为分隔符,也许你会想要一个常量,因为当你引用它时,它可能会使它的用途更加明确。但仅仅为打印日志消息定义常量是相当愚蠢的,因为它们的确切格式无关紧要。所有具有相同值的字符串文字都指向同一个对象,因此这个

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"one_answers"abc"),尽管我认为编译器可能会识别出你在做什么并对其进行优化。也许对编译器了解更多的人可以对此有所了解。无论如何,不要担心微观优化,除非你能证明性能是个问题。你会花很多精力,用户永远不会注意到你剃掉了几毫秒。

最新更新