Printf ditambahkan ke Java dengan rilis 1.5 tapi sepertinya saya tidak bisa menemukan cara mengirim output ke string daripada file (yang dilakukan sprintf di C). Adakah yang tahu bagaimana melakukan ini?
sumber
Printf ditambahkan ke Java dengan rilis 1.5 tapi sepertinya saya tidak bisa menemukan cara mengirim output ke string daripada file (yang dilakukan sprintf di C). Adakah yang tahu bagaimana melakukan ini?
// Store the formatted string in 'result'
String result = String.format("%4d", i * j);
// Write the result to standard output
System.out.println( result );
Lihat format dan sintaksnya
String adalah tipe yang tidak berubah. Anda tidak dapat memodifikasinya, hanya mengembalikan instance string baru.
Karena itu, memformat dengan metode instan tidak masuk akal, karena harus dipanggil seperti:
String formatted = "%s: %s".format(key, value);
Penulis Java asli (dan .NET penulis) memutuskan bahwa metode statis lebih masuk akal dalam situasi ini, karena Anda tidak memodifikasi target, tetapi memanggil metode format dan mengirimkan string input.
Berikut adalah contoh mengapa format()
menjadi bodoh sebagai metode contoh. Dalam. NET (dan mungkin di Jawa), Replace()
adalah metode instance.
Kamu bisa melakukan ini:
"I Like Wine".Replace("Wine","Beer");
Namun, tidak ada yang terjadi, karena string tidak dapat diubah. Replace()
mencoba mengembalikan string baru, tetapi tidak diberikan apa pun.
Ini menyebabkan banyak kesalahan rookie umum seperti:
inputText.Replace(" ", "%20");
Sekali lagi, tidak ada yang terjadi, yang harus Anda lakukan:
inputText = inputText.Replace(" ","%20");
Sekarang, jika Anda mengerti bahwa string tidak dapat diubah, itu masuk akal. Jika tidak, berarti Anda bingung. Tempat yang tepat untuk Replace()
berada format()
adalah, sebagai metode statis String
:
inputText = String.Replace(inputText, " ", "%20");
Sekarang tidak ada pertanyaan tentang apa yang terjadi.
Pertanyaan sebenarnya adalah, mengapa para penulis kerangka kerja ini memutuskan bahwa yang satu harus menjadi metode instan, dan yang lainnya statis? Menurut pendapat saya, keduanya lebih elegan diungkapkan sebagai metode statis.
Terlepas dari pendapat Anda, kebenarannya adalah bahwa Anda kurang rentan membuat kesalahan dengan menggunakan versi statis, dan kodenya lebih mudah dipahami (No Hidden Gotchas).
Tentu saja ada beberapa metode yang sempurna sebagai metode instance, ambil String.Length ()
int length = "123".Length();
Dalam situasi ini, sudah jelas kami tidak mencoba untuk memodifikasi "123", kami hanya memeriksanya, dan mengembalikan panjangnya. Ini adalah kandidat yang sempurna untuk metode instan.
Aturan sederhana saya untuk Metode Instance pada Objek yang Tidak Berubah:
Kedua solusi berfungsi untuk mensimulasikan printf, tetapi dengan cara yang berbeda. Misalnya, untuk mengonversi nilai ke string hex, Anda memiliki 2 solusi berikut:
dengan
format()
, paling dekat dengansprintf()
:dengan
replace(char oldchar , char newchar)
, agak lebih cepat tetapi sangat terbatas:Ada solusi ketiga yang terdiri dari hanya menambahkan char ke
ret
satu per satu (char adalah angka yang saling menambah !) Seperti di:... tapi itu akan sangat jelek.
sumber
Anda dapat melakukan printf untuk apa pun yang merupakan OutputStream dengan PrintStream. Entah seperti ini, mencetak ke aliran string:
Aliran string dapat dibuat seperti ini ByteArrayOutputStream:
sumber