6

Поддерживает ли Java многоточечные строки?

3

У меня возникла проблема с созданием многострочных строк в Java. Принимая во внимание мой опыт работы с Perl, я скучаю по возможностям «here-document», которые позволяют удобно создавать многострочные строки в коде. Например, в Perl это делается так:

$string = << "EOF"  # создание строк из трех линий
text
text
text
EOF

В Java же мне приходится использовать громоздкие кавычки и знаки «плюс» на каждой строке, когда я собираю свою многострочную строку с нуля.

Есть ли более удобные альтернативы? Может, определять строку в файле свойств?

Редактирование: В двух ответах упоминается, что использование StringBuilder.append() предпочтительнее конкатенации с помощью «плюс». Мог бы кто-то уточнить, почему они так считают? Для меня это не кажется более предпочтительным вариантом. Я ищу способ обойти то, что многострочные строки не являются примитивной составляющей языка, и мне определенно не хочется заменять одну примитивную конструкцию (конкатенацию строк с помощью «плюс») на вызовы методов.

Редактирование: Чтобы еще больше прояснить свой вопрос, я не беспокоюсь о производительности. Меня больше волнуют вопросы поддерживаемости и дизайна.

5 ответ(ов)

1

В Eclipse, если включить опцию "Экранировать текст при вставке в строковый литерал" (в Настройках > Java > Редактор > Ввод), и вы вставите многострочную строку в кавычках, автоматически будут добавлены " и \n" + для всех ваших строк.

Пример:

String str = "вставьте ваш текст сюда";

Таким образом, результат будет выглядеть следующим образом:

String str = "первая строка\n" +
              "вторая строка\n" +
              "третья строка";

Это позволяет избежать проблем с форматированием многострочного текста и сохраняет читаемость кода.

0

Другим вариантом может быть хранение длинных строк во внешнем файле, а затем чтение этого файла и загрузка содержимого в строку.

0

Это то, что вы никогда не должны использовать без осознания, что это делает. Однако для разовых скриптов я использовал это с большим успехом.

Пример:

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();
}

Обратите внимание, что такой подход может быть полезен в определённых ситуациях, но его использование должно быть тщательно обдумано, особенно из соображений читаемости и поддержки кода.

0

В Java 8 был добавлен новый статический метод в классе java.lang.String, который предлагает несколько более удобный способ объединения строк:

String.join( CharSequence delimiter, CharSequence... elements )

Вот пример его использования:

String s = String.join(
    System.getProperty("line.separator"),
    "Первая строка.",
    "Вторая строка.",
    "Остальные строки.",
    "И последняя!"
);

Этот метод позволяет указать разделитель, который будет использоваться между элементами, что делает код более читаемым и удобным.

0

Если вы определяете свои строки в файле свойств, это будет выглядеть гораздо менее читаемо. Если я правильно помню, они будут выглядеть так:

string:text\u000atext\u000atext\u000a

В общем, разумно избегать встраивания больших строк в исходный код. Лучше загружать их как ресурсы, возможно, в формате XML или читаемом текстовом формате. Текстовые файлы можно либо считывать во время выполнения, либо компилировать в исходный код Java. Если вы все же решите поместить их в исходный код, я бы предложил ставить + в начале и опускать лишние переносы строк:

final String text = ""
    +"text "
    +"text "
    +"text"
;

Если у вас есть переносы строк, возможно, стоит использовать метод объединения или форматирования:

final String text = join("\r\n"
    ,"text"
    ,"text"
    ,"text"
);
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь