Arka fon
Tüm Java nesnelerinin toString()
, nesneyi yazdırmaya çalıştığınızda çağrılan bir yöntemi vardır.
System.out.println(myObject); // invokes myObject.toString()
Bu yöntem Object
sınıfta tanımlanır (tüm Java nesnelerinin üst sınıfı). Object.toString()
Yöntemin, sınıf, bir ad oluşan oldukça çirkin görünümlü dize döndürür @
sembolü ve karma kodu onaltılık nesnenin. Bunun kodu şuna benzer:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Bu nedenle böyle bir sonuç com.foo.MyType@2f92e0f4
şöyle açıklanabilir:
com.foo.MyType
- sınıfın adı, yani sınıf MyType
pakette com.foo
.
@
- dizeye birlikte katılır
2f92e0f4
nesnenin hashcode'u.
Dizi sınıflarının adı biraz farklı görünür, bu da Javadocs için iyi açıklanmıştır Class.getName()
. Örneğin [Ljava.lang.String
:
[
- (zıt olarak, tek boyutlu dizi [[
ya da [[[
vs.)
L
- dizi bir sınıf veya arayüz içeriyor
java.lang.String
- dizideki nesnelerin türü
Çıktıyı Özelleştirme
Aradığınızda farklı bir şey yazdırmak için System.out.println(myObject)
, size gerekir geçersiztoString()
kendi sınıfında yöntemi. İşte basit bir örnek:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Şimdi bir a yazdırırsak Person
, onların adını görmekteyiz com.foo.Person@12345678
.
Bir nesnenin bir dizeye dönüştürülmesinin toString()
sadece bir yolu olduğunu unutmayın . Tipik olarak bu çıktı nesnenizi açık ve öz bir şekilde tam olarak tanımlamalıdır. Sınıfımız toString()
için daha iyi bir şey Person
olabilir:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Hangi baskı, örneğin Person[name=Henry]
. Hata ayıklama / test etme için gerçekten yararlı bir veri parçası.
Nesnenizin yalnızca bir yönüne odaklanmak veya çok sayıda cazip biçimlendirme eklemek istiyorsanız, bunun yerine ayrı bir yöntem tanımlamak daha iyi olabilir, örn String toElegantReport() {...}
.
Çıktıyı Otomatik Oluşturma
Birçok IDEtoString()
, sınıftaki alanlara bağlı olarak otomatik yöntem oluşturma desteği sunar . Örneğin Eclipse ve IntelliJ belgelerine bakın .
Birçok popüler Java kütüphanesi de bu özelliği sunar. Bazı örnekler:
Nesne gruplarını yazdırma
Böylece toString()
sınıfınız için hoş bir şey yarattınız . Bu sınıf bir diziye veya koleksiyona yerleştirilirse ne olur?
Diziler
Bir dizi nesneniz varsa Arrays.toString()
, dizinin içeriğinin basit bir temsilini oluşturmak için arayabilirsiniz . Örneğin, bu Person
nesne dizisini göz önünde bulundurun :
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Not: Bu, yukarıda tartıştığımızdan farklı olan Arrays sınıfında çağrılan statik bir yönteme çağrıdır toString()
.
Eğer bir varsa çok boyutlu dizi , kullanabileceğiniz Arrays.deepToString()
çıktı aynı tür elde etmek.
Koleksiyonları
Çoğu koleksiyon .toString()
, her öğeyi çağırmaya dayalı güzel bir çıktı üretecektir .
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Bu yüzden, liste öğelerinizin toString()
yukarıda tartışıldığı gibi bir hoş tanımladığından emin olmanız gerekir .