Bu, bir karakteri Java'daki bir String'e dönüştürmenin doğru yolu mu? [çiftleme]


20

booleanİki Strings süren bir işlev döndüren bir birim için birim testleri yazarken , her bir alfabenin ( 'a'- 'z') karakterini parametrelerden biri olarak sırayla test etmem gerekiyordu , bu yüzden bunu yapmak için yazdım:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

Bunun izin verilebilir olduğunu düşünürdüm, ama değildi, bu yüzden bunun yerine böyle yaptım:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

Bu Java içinde bir chara dönüştürmek için güvenilir bir yöntem Stringmi? Tercih edilen yol bu mu? Java hakkında çok şey bilmiyorum bu yüzden bu konuda biraz açıklama istiyorum.


2
Doğrudan sorunuza değil, amaIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch

3
@ElliottFrisch ama neden? Burada akışlar gereksizdir, ancak her döngü için akış kullanmakta ısrar etseniz bile, neden en azından kullanmıyorsunuz IntStream.rangeClosed('a', 'z')?
PhilipRoman

1
Tek bir 'doğru' yol yoktur. Muhtemelen bunu yapmanın en az beş yolu vardır: seçtiğiniz modaya olduğu kadar bilimsel gerçeklere de bağlıdır. Çoğu zaman önemli değildir ve bir test programı kesinlikle bu durumlardan biridir.
user207421

@PhilipRoman Çünkü orada (Edmund Hillary). Çünkü yapabilirim. Çünkü istiyoruz (Billie Piper, sanırım). Bu da havalı bir yaklaşım.
Elliott Frisch

Bunun izin Stringverilemez olduğunu düşünürdüm Var olmayan bir kurucuyu çağırmanın izin verilebileceğini mi düşünüyordun ? Eğer yanılıyorsam beni düzeltin, ama bildiğim kadarıyla, sınıfta Stringtek bir charargüman alan yapıcı yok . Bunun charile aynı olmadığını unutmayın char[].
Abra

Yanıtlar:


33

En kısa çözüm:

char c = 'a';
String s = "" + c;

En temiz (ve muhtemelen en verimli 1 ) çözümler:

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

Yaklaşımınızla karşılaştırıldığında, yukarıdaki ilkel bir Characternesneyi kutulamak zorunda kalmanın ek yükünü önler .


1 İlk yaklaşımdaki dize birleşiminin hafif verimsizliği derleyici veya çalışma zamanı tarafından optimize edilebilir, bu nedenle (biri çok eğimli ise) gerçek performansı belirlemek için gerçekten bir mikro ölçüt çalıştırmak zorunda kalacaktır. Bunun gibi mikro optimizasyonlar nadiren çaba sarf etmeye değer ve dize dönüşümünü zorlamak için birleştirmeye güvenmek çok hoş görünmüyor.


6
Son baktığımda, Sun'ın javacderleyici otomatik dönüşümleri String s = "" + c;içine String s = String.valueOf(c);performansı aynı olacaktır, bu yüzden.
Neil

4
@Neil Vay canına! Bu dipnotu yazdığım kişi türünün Stack Overflow'da artık mevcut olmadığını düşünmeye başladım :)
Robby Cornelissen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.