【发布时间】:2014-12-22 13:12:08
【问题描述】:
假设您想在游戏中显示欢迎消息,但需要将源代码中的行保持在最大长度为 80 个字符宽度。在游戏中,线条的长度并不重要。欢迎信息的一个例子是:
private void welcomeMessage() {
System.out.println("Welcome to the game. This message should learn me how to create a long messages like this in a read-able fashion. Imagine there is a limit of 80 characters per line for a programmer to see. How to fix this efficiently? This is one large line in my IDEA. ");
}
这一行太长了,每行代码不能包含 80 个字符,如滚动条所示。我以前学会了简单地做这样的事情:
private void welcomeMessage() {
System.out.println("Welcome to the game. This message should learn me" +
" how to create a long messages like this in a read-able " +
"fashion. Imagine there is a limit of 80 characters per line for" +
" a programmer to see. How to fix this efficiently? This is one " +
"large line in my IDEA. ");
}
但是我发现这个解决方案很难看,这会产生一个非常烦人的依赖关系。如果我只添加一个词到"Welcome to the game. This message should learn me",我必须更改所有其他行,因此一行之后的所有行都取决于它。
我也可以想象,仅仅因为以这种方式使其可读,就会受到惩罚。这让我想知道:
- 编译器是否直接附加所有行,因为它们本身不依赖于其他变量,还是在运行时发生? (恐怕它会调用连接运算符函数('+')4次)
- 在此示例中,带有 .append() 的 StringBuffer 是否会更有效,因为它不会创建 5 个字符串,而是将其附加到 StringBuilder 对象?
想象这是一个真正的游戏,你会不会只是制作一个 txt 文本文件并使用 StringBuffer 等导入它以在屏幕上显示它?或者你会如何显示更长的短信?
【问题讨论】:
-
String 连接实际上在幕后变成了
StringBuilder.append()。我个人会使用 StringBuilder 并为每一行追加,这样它看起来更干净(记得在每一行的开头放置一个空格)。或者,您可以使用 Apache Commons 配置并从.properties文件中读取值。 -
这个“要求”在什么时候起作用?如果只是在作业的最后,编写代码并仅在完成后调整格式。如果不是,您多久更改一次字符串 - 经常足以使它成为一个实际问题?
-
@Ascalonian 谢谢。从那个页面找到答案需要一段时间。这是 1 的答案。由常量表达式(第 15.28 节)计算的字符串在编译时计算,然后将它们视为文字。在运行时通过连接计算的字符串是新创建的,因此是不同的。你可以在这里看到什么是字符串文字:docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28
-
在这种情况下,您可能需要考虑使用外部文件。 (请注意,多语言版本之类的东西突然成为可能,而且几乎也是免费的。)
-
@Ascalonian,仅当您涉及变量时。编译时间常数由编译器评估。看我的回答。
标签: java string performance text