2014-12-22 49 views
1

想象一下,您希望向遊戲顯示歡迎消息,但需要將源代碼中的行保持爲最大長度爲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等中以將其顯示在屏幕上嗎?或者,你會如何顯示更長的短信?

+1

字符串連接實際上在後臺變成了'StringBuilder.append()'。我會親自使用一個StringBuilder併爲每行添加一行,使它看起來更乾淨(記住在每個行的開始末尾放置一個空格)。或者,您可以使用Apache Commons Configurations並從'.properties'文件中讀取值。 – Ascalonian

+0

這個「要求」在什麼時候起作用?如果只在作業的最後,編寫代碼,並且只在完成時調整格式。如果不是,你會多久更換一次字符串 - 往往足以讓它成爲一個實際問題? – usr2564301

+0

@Ascalonian謝謝。花了一段時間找到該頁面的答案。這裏是答案1.通過常量表達式計算的字符串(§15.28)在編譯時計算,然後視爲文字。 在運行時通過串聯計算的字符串是新創建的,因此是不同的。 你可以在這裏看到什麼字符串文字是:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28 – Joop

回答

2

編譯器是否直接附加所有行,因爲它們本身並不依賴於其他變量,或者它是否在運行時發生? (我擔心它會調用連接操作符函數('+')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  

[...] 
相關問題