Überprüfen Sie die Implementierung von Java toString ()

Eine toString-Methode, die eine Zeichenfolgendarstellung eines Objekts in Java zurückgibt. Normalerweise benutze ich es richtig, aber ich habe die Implementierung des Inhalts überprüft

Einführung (Anwendungsbeispiel)

Hoge.java


public class Hoge{
  @Override 
  public String toString(){
    return "Diese Klasse ist die Hoge-Klasse.";
  }
}

Test1.java


public class Test1{
  public static void main(String[] args){
    Object hoge = new Hoge();
    System.out.println(hoge);
  }
}

Wenn Sie die toString-Methode wie folgt überschreiben, Es ist eine praktische Funktion, die gute Dinge anzeigt, indem sie einfach in das Argument des Drucks eingefügt wird. (Die Berechnung, wenn sie als Zeichenfolge interpretiert werden kann, wird ebenfalls gut verarbeitet.)

Bestätigung der Umsetzung

Dieses Mal möchte ich diese Implementierung bestätigen.

Zunächst aus Dokumentbeschreibung.

Gibt eine Zeichenfolgendarstellung des Objekts zurück. Im Allgemeinen gibt die toString-Methode eine Zeichenfolge zurück, die dieses Objekt "textuell darstellt". Dieses Ergebnis sollte präzise und informativ für die menschliche Lesbarkeit sein. Wir empfehlen, diese Methode für alle Unterklassen zu überschreiben. Die toString-Methode der Klasse Object gibt eine Zeichenfolge zurück, die aus dem Namen der ursprünglichen Klasse, in der das Objekt eine Instanz ist, dem Atmark-Zeichen "@" und einer vorzeichenlosen hexadezimalen Darstellung des Hash-Codes des Objekts besteht. Das heißt, diese Methode gibt eine Zeichenfolge zurück, die den folgenden Werten entspricht:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Die toString-Methode ist standardmäßig in der Object-Klasse implementiert Der Klassenname und der Hash-Code werden angezeigt.

Die Object-Klasse ist eine Oberklasse aller Java-Klassen. Alle Klassen haben eine toString-Methode.

Verwendung von toString

Die toString-Methode wird normalerweise so behandelt Ich schätzte.

  1. Objekt-zu-String-Konvertierung (explizit)
  2. String Join Operator (implizit)

Lassen Sie uns überprüfen, ob diese Hypothese richtig ist.

Konvertierung von Objekt in Zeichenfolge

Zum Beispiel die Implementierung von System.out.println

Daher, wenn Object als Argument verwendet wird Überprüfen der Implementierung von System.out.println,

PrintStream.java



    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

Auf diese Weise rufen wir Object # valueOf () auf.

String.java


    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

Überprüfen der Implementierung der String-Klasse, Wenn das Argumentobjekt nicht null ist, wird toString aufgerufen. (Vermeiden Sie NullPointer)

String-Join-Operator

Das Verknüpfen mit dem Zeichenfolgenverbindungsoperator basiert auf der "Java-Sprachspezifikation". Die Verarbeitung ist je nach Version unterschiedlich. Da es kompliziert ist, werde ich die Details weglassen, aber durch den String-Join-Operator + Der Code scheint hinter den Kulissen als StringBuilder.append () behandelt zu werden.

Das Bild sieht so aus.

Test2.java


public class Test2{
  public static void main(String[] args){
    "time: " + new Date();
    // new StringBuilder().append("time: ").append(new Date());
  }
}

Lassen Sie uns daher die Implementierung von StringBuilder überprüfen.

StringBuilder.java


    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

Ah...


# Apropos

Das Array zeigt nicht den Inhalt der Liste an, die Array-Liste jedoch.
Manchmal ist es schwer, einen Fehler zu machen.

ArrayList-Oberklasse, AbstractCollection
Ich habe toString überschrieben.


#### **`AbstractCollection.java`**
```java

  public String toString() {
       Iterator<E> it = iterator();
       if (! it.hasNext())
           return "[]";

       StringBuilder sb = new StringBuilder();
       sb.append('[');
       for (;;) {
           E e = it.next();
           sb.append(e == this ? "(this Collection)" : e);
           if (! it.hasNext())
               return sb.append(']').toString();
           sb.append(',').append(' ');
       }
   }
```

Anscheinend [wird das Array durch die Sprachspezifikation definiert](https://docs.oracle.com/javase/specs/jls/se10/html/jls-10.html#jls-10.7)
Wenn man das betrachtet, fühlt es sich so an, weil die toString-Methode nicht überschrieben wird.

```java
class A<T> implements Cloneable, java.io.Serializable {
   public final int length = X;
   public T[] clone() {
       try {
           return (T[])super.clone();
       } catch (CloneNotSupportedException e) {
           throw new InternalError(e.getMessage());
       }
   }
}
```

Die Länge, die Anfänger zum Weinen gebracht hat, war in Ihrer Öffentlichkeit endgültig ...


# Am Ende

toString Bequem.


Recommended Posts

Überprüfen Sie die Implementierung von Java toString ()
Java-Versionsprüfung
Java-Überprüfungsprozess
Interpreter-Implementierung durch Java
Boyer-Moore-Implementierung in Java
Implementierung der Heap-Sortierung (in Java)
[Implementierung] Java Prozessklassennotizen
Überprüfen Sie die private Methode der Java9-Schnittstelle
[Java] Implementierung des Faistel-Netzwerks
[Java] Implementierungsmethode für die Timer-Verarbeitung
Überprüfen Sie die https-Verbindung mit Java
Java-Implementierung von Tri-Tree
[Java 8] Doppelte Löschung (& doppelte Überprüfung) mit Stream
[Java] Elementexistenzprüfung mit Stream
Java
Überprüfen Sie die Java-Parameter in Kubernetes-Pods
BloomFilter-Beschreibungs- und Implementierungsbeispiel (JAVA)
[Java] Beispiel für eine Überprüfung des Datumszeitraums
Java
Implementierung einer ähnlichen Funktion in Java
So überprüfen Sie, ob Java auf einem Mac installiert ist
Implementierung der Klonmethode für Java Record
Implementierung von DBlayer in Java (RDB, MySQL)
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
[Java] Verwendung der toString () -Methode
Java-Implementierung zum Erstellen und Lösen von Labyrinthen
Versuchen Sie es mit der REST-API von JobScheduler - Java RestClient-Implementierung -
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
[Java] Neue Spezifikation Implementierung der Yahoo! -Produktsuch-API
[Java] Überprüfen Sie die Anzahl der Zeichen
Überprüfen Sie die Heap-Nutzung mit Java Flight Recorder
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?