Saya memiliki metode dengan Object o
parameter.
Dalam metode ini, saya tahu persis ada String
in "o" yang bukan null. Tidak perlu memeriksa, atau melakukan sesuatu yang lain. Saya harus memperlakukannya persis seperti sebuah String
benda.
Hanya ingin tahu - apa yang lebih murah - melemparkannya ke String
, atau menggunakan Object.toString()
? Atau sama dengan time- / cpu- / mem- price?
Pembaruan: Metode menerima Object
karena ini adalah penerapan antarmuka. Tidak ada cara untuk mengubah tipe parameter.
Dan itu tidak mungkin null
sama sekali. Saya hanya ingin mengatakan bahwa saya tidak perlu memeriksanya untuk nol atau kosong. Dalam kasus saya, selalu ada string yang tidak kosong.
Jawaban:
casting ke String lebih murah karena tidak memerlukan panggilan fungsi eksternal, hanya pemeriksaan tipe internal.
sumber
Saya akan menggunakan pemeran. Itu memvalidasi "pengetahuan" Anda bahwa itu adalah string. Jika karena alasan apa pun Anda berakhir dengan bug dan seseorang mengirimkan sesuatu selain string, saya pikir akan lebih baik untuk memberikan pengecualian (yang akan dilakukan oleh pemeran) daripada terus mengeksekusi dengan data yang cacat.
sumber
Menurut renungan kinerja konyol: x.toString () vs (String) x
sumber
Jika Anda tahu Objek o adalah String, saya akan mengatakan melemparkannya ke String dan menerapkannya seperti itu. Memanggil toString () pada objek yang Anda tahu pasti adalah String mungkin akan menambah kebingungan.
Jika Object o bisa berupa apa saja selain String, Anda harus memanggil toString ().
sumber
(string)Registry.GetValue...
memunculkan pengecualian untuk mencoba mentransmisikan objek Int32, sedangkanRegistry.GetValue...ToString()
berfungsi seperti yang diharapkan.Saya tidak akan terlalu peduli dengan kinerjanya, jika operasi ini dilakukan bahkan hanya beberapa ribu kali per detik - tidak ada perbedaan yang nyata.
Namun, saya akan khawatir tentang "mengetahui" masukannya. Anda memiliki metode yang menerima
Object
dan Anda harus memperlakukannya seperti itu, yaitu Anda tidak boleh tahu apa-apa tentang parameter, selain itu mematuhiObject
antarmuka, yang kebetulan memilikitoString()
metode. Dalam hal ini, saya sangat menyarankan menggunakan metode itu daripada hanya mengasumsikan apa pun.OTOH, jika input selalu salah satu
String
ataunull
, cukup ubah metode untuk menerimaString
s, dan periksa secara eksplisit untuknull
s (yang harus Anda lakukan kapan pun ketika berhadapan dengan non-primitif ...)sumber
Mengingat bahwa tipe referensi adalah Object dan semua Object memiliki toString () panggil saja object.toString (). String.toString () baru saja mengembalikan ini.
sumber
Jika apa yang Anda miliki di "o" adalah String maka tidak banyak perbedaan (kemungkinan cast lebih cepat, tapi itu adalah implementasi VM / Library).
Jika "o" mungkin bukan String tetapi seharusnya String maka cast adalah yang Anda inginkan (tetapi Anda harus membuat metode ini mengambil String, bukan Objek).
Jika "o" bisa berupa tipe apa saja maka Anda harus menggunakan toString - tetapi pastikan untuk memeriksa null terlebih dahulu.
void foo(final Object o) { final String str; // without this you would get a class cast exception // be wary of using instanceof though - it is usually the wrong thing to do if(o instanceof String) { str = (String)o; } }
atau
void foo(final Object o) { final String str; // if you are 100% sure that o is not null then you can get rid of the else if(o != null) { str = o.toString(); } }
Saya lebih suka membuat kode yang terakhir sebagai:
void foo(final Object o) { final String str; if(o == null) { throw new IllegalArgumentException("o cannot be null"); } str = o.toString(); }
sumber
final
variabel mungkin belum diinisialisasi). Anda memerlukanelse
yang akan membuat pengecualian atau menginisialisasistr
sesuatu.Saya menemukan anehnya bahwa cast lebih lambat daripada pencarian vtable yang tersirat oleh panggilan tostring.
sumber
Tidak boleh ada 'string nol di o'. Jika o adalah nol, itu tidak mengandung string nol, itu hanya nol. Cukup periksa o untuk nol dulu. Jika Anda
mentransmisikanatau memanggil ToString () pada null, Anda akan crash.sumber