Hoe toString() correct overschrijven in Java?

Klinkt een beetje stom, maar ik heb hulp nodig bij mijn toString()-methode en het is erg irritant.
Ik heb geprobeerd online op te zoeken omdat de toStringdegene is waar het verprutst en “Kid-constructor #2 niet vindt”, ook al is het daar en ik zou zelfs iets anders doen en het werkt niet .
Ok dat was veel dus hier is mijn code:

import java.util.*; 
   class Kid {  
      String name; 
      double height; 
      GregorianCalendar bDay; 
      public Kid () { 
         this.name = "HEAD";
         this.height = 1; 
         this.bDay = new GregorianCalendar(1111,1,1); 
      } 
      public Kid (String n, double h, String date) {
      // method that toString() can't find somehow
         StringTokenizer st = new StringTokenizer(date, "/", true);
         n = this.name;
         h = this.height;
      } 
      public String toString() { 
         return Kid(this.name, this.height, this.bDay);
      } 
   } //end class 

Ok. Dus mijn toString hierboven (ik weet het, mijn derde parameter is uit, zou een String moeten zijn) is uit. Als ik een waarde hardcode in voor het derde ding, gaat het in de war en zegt dat het dit niet kan vinden (hierboven). Dus hoe kan ik de datum krijgen en het verbreken?

Les die dit noemt, staat hieronder

class Driver {   
   public static void main (String[] args) {   
      Kid kid1 = new Kid("Lexie", 2.6, "11/5/2009");   
      System.out.println(kid1.toString());
   } //end main method 
} //end class  

Ik heb geprobeerd meerdere constructeurs te onderzoeken en het heeft echt niet geholpen.
Ik heb geprobeerd om toString()-methoden te onderzoeken en probeerde eerdere logica van toString()-methoden te gebruiken die ik eerder heb gemaakt, maar dit is gloednieuw, dus het heeft nooit gewerkt.

Hulp?


Antwoord 1, autoriteit 100%

De toStringmoet een Stringretourneren.

public String toString() { 
    return "Name: '" + this.name + "', Height: '" + this.height + "', Birthday: '" + this.bDay + "'";
} 

Ik raad je aan gebruik te maken van de mogelijkheden van je IDE om de toStringmethode te genereren. Codeer het niet met de hand.

Eclipse kan dit bijvoorbeeld doen als u met de rechtermuisknop op de broncode klikt en Source > Generate toString


Antwoord 2, autoriteit 10%

Java toString() methode

Als je een willekeurig object als een tekenreeks wilt voorstellen, ontstaat de methode toString() .

De methode toString() retourneert de tekenreeksrepresentatie van het object.

Als u een object afdrukt, roept java-compiler intern de methode toString() op het object aan. Dus door de methode toString() te negeren, wordt de gewenste uitvoer geretourneerd, dit kan de status van een object zijn, enz., hangt af van uw implementatie.

Voordeel van de Java toString()-methode

Door de methode toString() van de klasse Object te negeren, kunnen we waarden van het object retourneren, zodat we niet veel code hoeven te schrijven.

Uitvoer zonder methode toString()

class Student{  
 int id;  
 String name;  
 String address;  
 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  
   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
}  
Output:[email protected]
       [email protected]

Je kunt in het bovenstaande voorbeeld #1 zien. afdrukken s1 en s2 drukt de Hashcode-waarden van de objecten af, maar ik wil de waarden van deze objecten afdrukken. Aangezien de Java-compiler de methode toString() intern aanroept, zal het negeren van deze methode de opgegeven waarden retourneren. Laten we het begrijpen met het onderstaande voorbeeld:

Example#2
Output with overriding toString() method
class Student{  
 int id;  
 String name;  
 String address;  
 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  
//overriding the toString() method  
public String toString(){ 
  return id+" "+name+" "+address;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  
   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
} 
Output:100 Joe success
       50 Jeff fail

Merk op dat toString() meestal gerelateerd is aan het concept van polymorfisme in Java.
Probeer in Eclipse op toString() te klikken en klik er met de rechtermuisknop op. Klik vervolgens op Verklaring openen en kijk waar de Superclass toString() vandaan komt.


Antwoord 3, autoriteit 6%

Zoals anderen hebben uitgelegd, is de toStringniet de plaats om je klas te instantiëren. In plaats daarvan is de toString-methode bedoeld om een tekenreeks te bouwen die de waarde van een instantie van uw klasse vertegenwoordigt, die rapporteert over ten minste de belangrijkste gegevensvelden die in dat object zijn opgeslagen. In de meeste gevallen wordt toStringgebruikt voor foutopsporing en logboekregistratie, niet voor uw bedrijfslogica.

Als u tekst wilt genereren die de waarde van een object vertegenwoordigt voor weergave aan een gebruiker, voegt u een andere methode toe. Mensen noemen de methode vaak zoiets als getDisplayName. Bijvoorbeeld DayOfWeek::getDisplayNameen Month::getDisplayName.

StringJoiner

Vanaf Java 8 en later zou de meest moderne manier om toStringte implementeren de StringJoinerklasse. Zoals de doc zegt:

StringJoiner wordt gebruikt om een reeks tekens te construeren, gescheiden door een scheidingsteken en optioneel beginnend met een opgegeven voorvoegsel en eindigend met een meegeleverd achtervoegsel.

Gebruik als volgt:

@Override
public String toString ()
{
    return new StringJoiner(                           // In Java 8 and later, StringJoiner is used to construct a sequence of characters separated by a delimiter and optionally starting with a supplied prefix and ending with a supplied suffix.
                " | " ,                                // Delimiter
                Person.class.getSimpleName() + "[ " ,  // Prefix
                " ]"                                   // Suffix
            )
            .add( "name=" + name )                     // Append
            .add( "phone=" + phone )                   // Append
            .toString();                               // Convert entire sequence to a single `String` object.
}

Persoon[ name=Alice | telefoon=555.867.5309 ]

record

Java 16 biedt een nieuwe manier om een klasse kort te definiëren waarbij het belangrijkste doel is om gegevens transparant en onveranderlijk te communiceren: opnemen.

U definieert een record door alleen het type en de naam van elk lidveld op te sommen. De compiler maakt impliciet de constructor, getters, equals& hashCodeen toString.

Standaard implementatie van toString

De standaardimplementatie van toStringomvat elk lidveld.

public Kid { String name , double height , LocalDate birthDate ) {} 

Instantiëren zoals elk ander object.

Kid alice = new Kid( "Alice" , 6.1d , LocalDate.of( 2019 , Month.April , 23 ) ) ;
String output = alice.toString() ;

U kunt ervoor kiezen om de standaardimplementatie te overschrijven met uw eigen implementatie. Overschrijvingen zijn meestal niet nodig gezien het doel van een record als een eenvoudige gegevensdrager.


Antwoord 4, autoriteit 3%

U kunt een nieuw object maken in de toString().
gebruik

return "Name = " + this.name +" height= " + this.height;

in plaats van

return Kid(this.name, this.height, this.bDay);

U kunt desgewenst de return-tekenreeks wijzigen. Er zijn andere manieren om datum op te slaan in plaats van kalender.


Antwoord 5, autoriteit 2%

Je kunt een constructor niet aanroepen alsof het een normale methode is, je kunt hem alleen aanroepen met newom een nieuw object te maken:

Kid newKid = new Kid(this.name, this.height, this.bDay);

Maar het maken van een nieuw object uit uw toString()-methode is niet wat u wilt doen.


Antwoord 6

De volgende code is een voorbeeld. Vraag op basis van hetzelfde, in plaats van het gebruik van op IDE gebaseerde conversie, is er een snellere manier om te implementeren, zodat in de toekomst de wijzigingen plaatsvinden, we de waarden niet steeds opnieuw hoeven te wijzigen?

@Override
    public String toString() {
        return "ContractDTO{" +
                "contractId='" + contractId + '\'' +
                ", contractTemplateId='" + contractTemplateId + '\'' +
                '}';
    }

Antwoord 7

Als je geïnteresseerd bent in Unit-Tests, dan kun je een openbare “ToStringTemplate” declareren, en dan kun je je toString unit testen. Zelfs als je het niet unit-test, denk ik dat het “schoner” is en String.format gebruikt.

public class Kid {
    public static final String ToStringTemplate = "KidName='%1s', Height='%2s', GregCalendar='%3s'";
    private String kidName;
    private double height;
    private GregorianCalendar gregCalendar;
    public String getKidName() {
        return kidName;
    }
    public void setKidName(String kidName) {
        this.kidName = kidName;
    }
    public double getHeight() {
        return height;
    }
    public void setHeight(double height) {
        this.height = height;
    }
    public GregorianCalendar getGregCalendar() {
        return gregCalendar;
    }
    public void setGregCalendar(GregorianCalendar gregCalendar) {
        this.gregCalendar = gregCalendar;
    }
    public String toString() { 
        return String.format(ToStringTemplate, this.getKidName(), this.getHeight(), this.getGregCalendar());
    } 
}

Je kunt nu eenheden testen door de Kid te maken, de eigenschappen in te stellen en je eigen string.format op de ToStringTemplate te doen en te vergelijken.

ToStringTemplate static-final maken betekent “ÉÉN VERSIE” van de waarheid, in plaats van een “kopie” van de sjabloon in de unit-test te hebben.


Antwoord 8

Nou, eigenlijk moet je zoiets als dit retourneren, omdat toString een string moet retourneren

public String toString() {
 return "Name :" + this.name + "whatever :" + this.whatever + "";
}

en je doet eigenlijk iets verkeerd in de constructer, je stelt de variabele in die de gebruiker heeft ingesteld op de naam, terwijl je het tegenovergestelde moet doen.
Wat u niet moet doen

n = this.name

Wat u moet doen

this.name = n

Hopelijk helpt dit, bedankt


Antwoord 9

we kunnen zelfs zo schrijven door een nieuw String-object in de klasse te maken en het toe te wijzen wat we maar willen in de constructor en dat terug te geven in de methode toString die wordt overschreven

public class Student{  
 int id;  
 String name;  
 String address;  
 String details;
 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 this.details=id+"  "+name+"  "+address;  
 }  
//overriding the toString() method  
public String toString(){ 
  return details;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,"Joe","success");  
   Student s2=new Student(50,"Jeff","fail");  
   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
}

Antwoord 10

Een leuke en beknopte manier is om Lombok-annotaties te gebruiken. Het heeft @ToStringannotatie, die een implementatie van de toString()methode zal genereren. Standaard wordt uw klasnaam afgedrukt, samen met elk veld, in volgorde, gescheiden door komma’s.
U kunt uw uitvoer eenvoudig aanpassen door parameters door te geven aan annotaties, bijvoorbeeld:

@ToString(of = {"name", "lastName"})

Het equivalent van pure Java:

public String toString() {
        return "Person(name=" + this.name + ", lastName=" + this.experienceInYears + ")";
    }

Antwoord 11

Als u toString()alleen gebruikt voor het opsporen van fouten in een DTO, kunt u genereer automatisch door mensen leesbareuitvoer met zoiets als het volgende:

import com.fasterxml.jackson.databind.ObjectMapper;
...
public String toString() {
    try { return new ObjectMapper().writeValueAsString(this); }
    catch (Exception e) { return "{ObjectMapper failed}"; }
}

Dit is echter niet geschikt voor productie-implementaties als de DTO PII kan bevatten (die niet in logboeken mag worden vastgelegd).


Antwoord 12

Altijd een gemakkelijke manier: Rechts klikken> Genereren> toString()> selecteer de gewenste sjabloon.
voer hier de afbeeldingsbeschrijving in


Antwoord 13

Naar mijn mening is de beste manier om de google gson-bibliotheek te gebruiken:

       @Override
public String toString() {
    return new GsonBuilder().setPrettyPrinting().create().toJson(this);
}

of apache commons lang reflectie manier


Antwoord 14

  1. als u Kladblok gebruikt:
    dan

    public String toString(){
     return ""; ---now here you can use variables which you have created for your class
    }
    
  2. als je eclipse IDE gebruikt, dan
    druk op

    -alt +shift +s 
    

    -klik op overschrijven toString methode hier krijg je opties om te selecteren welk type variabelen je wilt selecteren.

Other episodes