Berasal dari Perl, saya benar-benar kehilangan sarana "di sini-dokumen" untuk membuat string multi-line dalam kode sumber:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
Di Jawa, saya harus memiliki tanda kutip yang rumit dan tanda plus di setiap baris saat saya menggabungkan string multiline saya dari awal.
Apa saja alternatif yang lebih baik? Tentukan string saya di file properti?
Sunting : Dua jawaban mengatakan StringBuilder.append () lebih disukai daripada notasi plus. Adakah yang bisa menjelaskan mengapa mereka berpikir demikian? Sama sekali tidak terlihat lebih disukai bagi saya. Saya sedang mencari cara mengatasi kenyataan bahwa string multiline bukan merupakan konstruksi bahasa kelas satu, yang berarti saya pasti tidak ingin mengganti konstruksi bahasa kelas satu (rangkaian string dengan plus) dengan pemanggilan metode.
Edit : Untuk memperjelas pertanyaan saya lebih lanjut, saya sama sekali tidak peduli dengan kinerja. Saya khawatir tentang rawatan dan masalah desain.
string1 + string2
Anda mengalokasikan objek string baru dan menyalin karakter dari kedua string input. Jika Anda menambahkan n String bersama-sama Anda akan melakukan alokasi n-1 dan sekitar (n ^ 2) / 2 salinan karakter. StringBuilder, di sisi lain, menyalin dan merealokasi lebih jarang (meskipun masih melakukan keduanya ketika Anda melebihi ukuran buffer internal). Secara teoritis, ada beberapa kasus di mana kompiler dapat mengonversi + untuk menggunakan StringBuilder tetapi dalam praktiknya siapa tahu.Jawaban:
Stephen Colebourne telah membuat proposal untuk menambahkan string multi-line di Java 7.
Juga, Groovy sudah memiliki dukungan untuk string multi-line .
sumber
Sepertinya Anda ingin melakukan multiline literal, yang tidak ada di Jawa.
Alternatif terbaik Anda akan menjadi string yang hanya
+
bersama. Beberapa opsi lain yang telah disebutkan orang (StringBuilder, String.format, String.join) hanya akan lebih disukai jika Anda mulai dengan array string.Pertimbangkan ini:
Versus
StringBuilder
:Versus
String.format()
:Versus Java8
String.join()
:Jika Anda ingin baris baru untuk sistem tertentu, Anda baik perlu digunakan
System.lineSeparator()
, atau Anda dapat menggunakan%n
diString.format
.Pilihan lain adalah menempatkan sumber daya dalam file teks, dan cukup membaca konten file itu. Ini lebih disukai untuk string yang sangat besar untuk menghindari kembung yang tidak perlu file kelas Anda.
sumber
String.format
versi ini adalah Anda harus menjaga format tetap sinkron dengan jumlah baris.Dalam Eclipse jika Anda mengaktifkan opsi "Teks melarikan diri ketika menempelkan ke string literal" (dalam Preferensi> Java> Editor> Mengetik) dan tempel string multi- baris mengutip kutipan, itu akan secara otomatis menambah
"
dan\n" +
untuk semua baris Anda.sumber
\r
s yang Eclipse masukkan pada Windows?Ini adalah utas lama, tetapi solusi baru yang cukup elegan (dengan hanya 4 mungkin 3 kekurangan kecil) adalah menggunakan anotasi khusus.
Periksa: http://www.adrianwalker.org/2011/12/java-multiline-string.html
Sebuah proyek yang terinspirasi dari pekerjaan itu diselenggarakan di GitHub:
https://github.com/benelog/multiline
Contoh kode Java:
Kekurangannya adalah
<%= variable %>
) :-)Dan Anda mungkin harus mengkonfigurasi Eclipse / Intellij-Idea untuk tidak memformat ulang komentar Javadoc Anda secara otomatis.
Orang mungkin menemukan ini aneh (komentar Javadoc tidak dirancang untuk menanamkan apa pun selain komentar), tetapi karena kurangnya string multiline di Jawa pada akhirnya benar-benar menjengkelkan, saya menemukan ini menjadi solusi yang paling tidak terburuk.
sumber
Opsi lain mungkin untuk menyimpan string panjang dalam file eksternal dan membaca file menjadi string.
sumber
@
sintaks untuk C # jauh lebih bersih.Ini adalah sesuatu yang seharusnya tidak pernah Anda miliki gunakan tanpa memikirkan apa yang dilakukannya. Tetapi untuk skrip satu kali, saya telah menggunakan ini dengan sangat sukses:
Contoh:
Kode:
sumber
String.join
Java 8 menambahkan metode statis baru
java.lang.String
yang menawarkan alternatif yang sedikit lebih baik:String.join( CharSequence delimiter , CharSequence... elements )
Menggunakannya:
sumber
"\n"
diperlukan manual , dan menyadari portabilitas!JEP 355: Blok Teks (Pratinjau) bertujuan untuk mencakup fungsi ini, saat ini menargetkan JDK 13 sebagai fitur pratinjau. Mengizinkan untuk menulis sesuatu seperti:
Sebelum JEP ini, di JDK12, JEP 326: Raw String Literals bertujuan untuk mengimplementasikan fitur yang serupa, tetapi akhirnya ditarik.
sumber
Jika Anda mendefinisikan string dalam file properti, itu akan terlihat jauh lebih buruk. IIRC, akan terlihat seperti:
Biasanya ide yang masuk akal untuk tidak menanamkan string besar ke sumber. Anda mungkin ingin memuatnya sebagai sumber daya, mungkin dalam XML atau format teks yang dapat dibaca. File teks dapat dibaca pada saat runtime atau dikompilasi ke sumber Java. Jika Anda akhirnya menempatkannya di sumber, saya sarankan meletakkannya
+
di depan dan menghilangkan baris baru yang tidak perlu:Jika Anda memiliki baris baru, Anda mungkin ingin beberapa metode bergabung atau memformat:
sumber
Plus dikonversi menjadi StringBuilder.append, kecuali jika kedua string adalah konstanta sehingga kompiler dapat menggabungkannya pada waktu kompilasi. Setidaknya, begitulah dalam kompiler Sun, dan saya akan curiga jika tidak semua kompiler lain akan melakukan hal yang sama.
Begitu:
biasanya menghasilkan kode yang persis sama dengan:
Di samping itu:
sama dengan:
Artinya, tidak ada penalti dalam memutus string string Anda di beberapa baris dengan tanda plus untuk dibaca.
sumber
Di IntelliJ IDE, Anda hanya perlu mengetik:
Lalu posisikan kursor Anda di dalam tanda kutip dan tempelkan string Anda. IDE akan mengembangkannya menjadi beberapa baris gabungan.
sumber
Sayangnya, Java tidak memiliki string multi-line literal. Anda harus menggabungkan string literal (menggunakan + atau StringBuilder menjadi dua pendekatan paling umum untuk ini) atau membaca string dalam dari file terpisah.
Untuk multi-line string literal besar saya cenderung menggunakan file terpisah dan membacanya menggunakan
getResourceAsStream()
(metodeClass
kelas). Ini membuatnya mudah untuk menemukan file karena Anda tidak perlu khawatir tentang direktori saat ini versus di mana kode Anda diinstal. Ini juga membuat pengemasan lebih mudah, karena Anda sebenarnya dapat menyimpan file dalam file jar Anda.Misalkan Anda berada di kelas yang disebut Foo. Lakukan sesuatu seperti ini:
Satu gangguan lain adalah bahwa Java tidak memiliki standar "baca semua teks dari Pembaca ini menjadi metode". Sangat mudah untuk menulis:
sumber
Tapi, alternatif terbaik adalah menggunakan String.format
sumber
Karena Java belum (belum) mendukung string multi-line, satu-satunya cara untuk sekarang adalah meretasnya menggunakan salah satu teknik yang disebutkan di atas. Saya membuat skrip Python berikut menggunakan beberapa trik yang disebutkan di atas:
Masukkan itu ke dalam file bernama javastringify.py dan string Anda di file mystring.txt dan jalankan sebagai berikut:
Anda kemudian dapat menyalin output dan menempelkannya ke editor Anda.
Ubah ini sesuai kebutuhan untuk menangani setiap kasus khusus tetapi ini sesuai dengan kebutuhan saya. Semoga ini membantu!
sumber
Anda dapat menggunakan scala-code, yang kompatibel dengan java, dan memungkinkan multiline-Strings terlampir dengan "" ":
(perhatikan kutipan di dalam string) dan dari java:
Apakah ini lebih nyaman ...?
Pendekatan lain, jika Anda sering menangani teks panjang, yang harus ditempatkan dalam kode sumber Anda, mungkin berupa skrip, yang mengambil teks dari file eksternal, dan membungkusnya sebagai multiline-java-String seperti ini:
sehingga Anda dapat memotong dan menempelkannya dengan mudah ke sumber Anda.
sumber
Anda dapat menggabungkan pelengkap Anda dengan metode terpisah seperti:
Either way, lebih suka
StringBuilder
notasi plus.sumber
Sebenarnya, berikut ini adalah implementasi terbersih yang saya lihat sejauh ini. Ini menggunakan anotasi untuk mengubah komentar menjadi variabel string ...
Jadi, hasil akhirnya adalah bahwa variabel html berisi string multiline. Tidak ada kutipan, tidak ada plus, tidak ada koma, hanya string murni.
Solusi ini tersedia di URL berikut ... http://www.adrianwalker.org/2011/12/java-multiline-string.html
Semoga itu bisa membantu!
sumber
Lihat Java Stringfier . Mengubah teks Anda menjadi blok java StringBuilder keluar jika diperlukan.
sumber
sumber
Alternatif yang belum saya lihat sebagai jawabannya adalah
java.io.PrintWriter
.Juga fakta yang
java.io.BufferedWriter
memilikinewLine()
metode tidak disebutkan.sumber
Jika Anda menyukai jambu google sebanyak yang saya lakukan, itu dapat memberikan representasi yang cukup bersih dan cara yang bagus dan mudah untuk tidak membuat hardcode karakter baris baru Anda juga:
sumber
Gunakan
Properties.loadFromXML(InputStream)
. Tidak perlu untuk lib eksternal.Lebih baik daripada kode yang berantakan (karena perawatan dan desain menjadi perhatian Anda), lebih disukai untuk tidak menggunakan string panjang.
Mulailah dengan membaca properti xml:
maka Anda dapat menggunakan string multiline dengan cara yang lebih mudah dikelola ...
MultiLine.xml` terletak di folder YourClass yang sama:
PS .: Anda dapat menggunakan
<![CDATA["
..."]]>
untuk string seperti xml.sumber
Dengan JDK / 12 akses awal build # 12 , seseorang sekarang dapat menggunakan string multiline di Jawa sebagai berikut:
dan ini menghasilkan output sebagai berikut:
Sunting: Ditunda ke java 13
sumber
Solusi independen yang cukup efisien dan platform akan menggunakan properti sistem untuk pemisah baris dan kelas StringBuilder untuk membangun string:
sumber
Satu pilihan bagus.
sumber
Java 13 dan selanjutnya
Multiline Strings sekarang didukung di Jawa melalui Blok Teks . Di Java 13 dan 14, fitur ini mengharuskan Anda untuk mengatur
––enable–preview
opsi saat membangun dan menjalankan proyek Anda. Lihat dokumentasi Java ini untuk lebih jelasnya.Sekarang, sebelum Java 13, ini adalah bagaimana Anda akan menulis kueri:
Berkat Blok Teks Java 13, Anda dapat menulis ulang kueri ini sebagai berikut:
Jauh lebih mudah dibaca, bukan?
Dukungan IDE
IntelliJ IDEA menyediakan dukungan untuk mengubah
String
blok gabungan legacy keString
format multiline baru :JSON, HTML, XML
Multiline
String
sangat berguna saat menulis JSON, HTML, atau XML.Pertimbangkan contoh ini menggunakan
String
penggabungan untuk membangun string literal JSON:Anda hampir tidak dapat membaca JSON karena karakter yang melarikan diri dan banyaknya tanda kutip ganda dan tanda plus.
Dengan Blok Teks Java, objek JSON dapat ditulis seperti ini:
Sejak saya menggunakan C # pada tahun 2004, saya ingin memiliki fitur ini di Java, dan sekarang akhirnya kita memilikinya.
sumber
String multiline tidak diizinkan dalam file properti. Anda dapat menggunakan \ n dalam file properti, tetapi saya rasa itu bukan solusi dalam kasus Anda.
sumber
Saya tahu ini adalah pertanyaan lama, namun untuk pengembang intersted, Multi-literal literals akan berada di # Java12
http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html
sumber
Saya menyarankan menggunakan utilitas seperti yang disarankan oleh ThomasP, dan kemudian menautkannya ke proses build Anda. File eksternal masih ada berisi teks, tetapi file tersebut tidak dibaca saat runtime. Alur kerjanya adalah:
class TextBlock {...
diikuti oleh string statis yang dihasilkan secara otomatis dari file sumber dayasumber
Ketika serangkaian panjang + digunakan, hanya satu StringBuilder dibuat, kecuali String ditentukan pada waktu kompilasi dalam hal ini tidak ada StringBuilder digunakan!
Satu-satunya waktu StringBuilder lebih efisien adalah ketika banyak pernyataan digunakan untuk membangun String.
Catatan: Hanya satu StringBuilder yang dibuat.
Buat sejelas dan sesederhana mungkin.
sumber