Представьте, что вы хотите отображать приветственное сообщение в игре, но должны содержать строки в исходном коде с максимальной длиной в 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"
просто одно слово, которое я должен изменить, все остальные строки, поэтому все строки после строки зависят от него.
Я также могу предположить, что существуют штрафы только для того, чтобы сделать его доступным для чтения таким образом. Это удивляет меня:
Представьте, что это была настоящая игра, вы бы просто сделали текстовый файл txt и импортировали его с помощью StringBuffer и т.д., Чтобы отобразить его на экране? Или как еще вы могли бы отображать более длинные текстовые сообщения?
Содержит ли компилятор все строки напрямую, поскольку они сами не зависят от других переменных или это происходит во время выполнения? (Я боюсь, что он будет называть операторную функцию конкатенации ("+") 4 раза)
Компилятор объединяет строки. Накладные расходы не работают.
Будет ли StringBuffer с.append() более эффективным в этом примере, потому что он не создает 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
[...]
StringBuilder.append()
за кулисами. Я бы лично использовал StringBuilder и добавлял каждую строку, чтобы она выглядела более чистой (не забывая ставить пробел в конце начала каждой). Или вы можете использовать конфигурации Apache Commons и прочитать значение из файла.properties
.