Поддерживает ли Java многоточечные строки?
У меня возникла проблема с созданием многострочных строк в Java. Принимая во внимание мой опыт работы с Perl, я скучаю по возможностям «here-document», которые позволяют удобно создавать многострочные строки в коде. Например, в Perl это делается так:
$string = << "EOF" # создание строк из трех линий
text
text
text
EOF
В Java же мне приходится использовать громоздкие кавычки и знаки «плюс» на каждой строке, когда я собираю свою многострочную строку с нуля.
Есть ли более удобные альтернативы? Может, определять строку в файле свойств?
Редактирование: В двух ответах упоминается, что использование StringBuilder.append()
предпочтительнее конкатенации с помощью «плюс». Мог бы кто-то уточнить, почему они так считают? Для меня это не кажется более предпочтительным вариантом. Я ищу способ обойти то, что многострочные строки не являются примитивной составляющей языка, и мне определенно не хочется заменять одну примитивную конструкцию (конкатенацию строк с помощью «плюс») на вызовы методов.
Редактирование: Чтобы еще больше прояснить свой вопрос, я не беспокоюсь о производительности. Меня больше волнуют вопросы поддерживаемости и дизайна.
5 ответ(ов)
В Eclipse, если включить опцию "Экранировать текст при вставке в строковый литерал" (в Настройках > Java > Редактор > Ввод), и вы вставите многострочную строку в кавычках, автоматически будут добавлены "
и \n" +
для всех ваших строк.
Пример:
String str = "вставьте ваш текст сюда";
Таким образом, результат будет выглядеть следующим образом:
String str = "первая строка\n" +
"вторая строка\n" +
"третья строка";
Это позволяет избежать проблем с форматированием многострочного текста и сохраняет читаемость кода.
Другим вариантом может быть хранение длинных строк во внешнем файле, а затем чтение этого файла и загрузка содержимого в строку.
Это то, что вы никогда не должны использовать без осознания, что это делает. Однако для разовых скриптов я использовал это с большим успехом.
Пример:
System.out.println(S(/*
Это СУПЕР " ' ' " многострочная строка с разнообразными странными
символами!
*/));
Код:
// Из: http://blog.efftinge.de/2008/10/multi-line-string-literals-in-java.html
// Принимает комментарий (/**/) и возвращает все внутри комментария как строку из S()
public static String S() {
StackTraceElement element = new RuntimeException().getStackTrace()[1];
String name = element.getClassName().replace('.', '/') + ".java";
StringBuilder sb = new StringBuilder();
InputStream in = classLoader.getResourceAsStream(name);
String s = convertStreamToString(in, element.getLineNumber());
return s.substring(s.indexOf("/*")+2, s.indexOf("*/"));
}
// Из http://www.kodejava.org/examples/266.html
private static String convertStreamToString(InputStream is, int lineNum) {
/*
* Чтобы преобразовать InputStream в String, мы используем метод BufferedReader.readLine().
* Мы продолжаем итерацию до тех пор, пока BufferedReader не вернёт null, что означает,
* что больше нет данных для чтения. Каждая строка будет добавлена в StringBuilder
* и возвращена как String.
*/
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
int i = 1;
try {
while ((line = reader.readLine()) != null) {
if (i++ >= lineNum) {
sb.append(line + "\n");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
Обратите внимание, что такой подход может быть полезен в определённых ситуациях, но его использование должно быть тщательно обдумано, особенно из соображений читаемости и поддержки кода.
В Java 8 был добавлен новый статический метод в классе java.lang.String
, который предлагает несколько более удобный способ объединения строк:
String.join( CharSequence delimiter, CharSequence... elements )
Вот пример его использования:
String s = String.join(
System.getProperty("line.separator"),
"Первая строка.",
"Вторая строка.",
"Остальные строки.",
"И последняя!"
);
Этот метод позволяет указать разделитель, который будет использоваться между элементами, что делает код более читаемым и удобным.
Если вы определяете свои строки в файле свойств, это будет выглядеть гораздо менее читаемо. Если я правильно помню, они будут выглядеть так:
string:text\u000atext\u000atext\u000a
В общем, разумно избегать встраивания больших строк в исходный код. Лучше загружать их как ресурсы, возможно, в формате XML или читаемом текстовом формате. Текстовые файлы можно либо считывать во время выполнения, либо компилировать в исходный код Java. Если вы все же решите поместить их в исходный код, я бы предложил ставить +
в начале и опускать лишние переносы строк:
final String text = ""
+"text "
+"text "
+"text"
;
Если у вас есть переносы строк, возможно, стоит использовать метод объединения или форматирования:
final String text = join("\r\n"
,"text"
,"text"
,"text"
);
Как преобразовать строку в int в Java?
Как присвоить многострочную строку переменной?
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как сгенерировать случайную алфавитно-цифровую строку
Как написать многострочные строки в Go?