【问题标题】:Splitting long text into multiple lines of code, best way to do it?将长文本拆分为多行代码,最好的方法是什么?
【发布时间】: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",我必须更改所有其他行,因此一行之后的所有行都取决于它。

我也可以想象,仅仅因为以这种方式使其可读,就会受到惩罚。这让我想知道:

  1. 编译器是否直接附加所有行,因为它们本身不依赖于其他变量,还是在运行时发生? (恐怕它会调用连接运算符函数('+')4次)
  2. 在此示例中,带有 .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


【解决方案1】:

编译器是否直接附加所有行,因为它们本身不依赖于其他变量,还是在运行时发生? (恐怕它会调用连接运算符函数('+')4次)

编译器将连接字符串。没有运行时开销。

在此示例中,带有 .append() 的 StringBuffer 是否会更有效,因为它不会创建 5 个字符串,而是将其附加到 StringBuilder 对象?

没有。


演示:

class Test {
    public static String test = "a" + "b" + "c";
}

命令

javac Test.java && javap -c -v Test

产生以下输出

[...]
Constant pool:
   #1 = Methodref          #5.#15         //  java/lang/Object."<init>":()V
   #2 = String             #16            //  abc
   #3 = Fieldref           #4.#17         //  Test.test:Ljava/lang/String;
[...]

Code:
  stack=1, locals=0, args_size=0
     0: ldc           #2                  // String abc
     2: putstatic     #3                  // Field test:Ljava/lang/String;
     5: return     

[...]

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 2019-09-18
    • 1970-01-01
    • 2010-09-19
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多