Вопрос по java – Как правильно переопределить toString () в Java?

65

Звучит немного глупо, но мне нужна помощь на моемtoString() метод и это очень раздражает. Я пытался искать в Интернете, потому чтоtoString это тот, где он облажался и "не нашел конструктор Kid # 2" хотя он есть, и я бы даже сделал что-то еще, и это не сработало. Хорошо, это было много, вот мой код:

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 

Итак, мой toString выше (я знаю, мой третий параметр выключен, должен быть String) выключен. Если я жестко закодирую значение для третьей вещи, он выходит из строя и говорит, что не может найти это (см. Выше). Так как я могу получить дату и разбить ее?

Класс, вызывающий это ниже

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  

Я пытался исследовать несколько конструкторов, и это действительно не помогло. Я пытался исследоватьtoString() методы, и попытался с помощью предыдущегоtoString() методы логики, которые я создал предыдущие, но это совершенно новый, поэтому он никогда не работал.

Помогите?

Spring ToStringCreator (github.com/SpringSource/spring-framework/tree/master/…) делает работу очень хорошо. Ritesh
К вашему сведению, ужасно хлопотные старые классы даты и времени, такие какjava.util.Date, java.util.GregorianCalendar а такжеjava.text.SimpleDateFormat есть сейчасlegacyвытесненыjava.time классы, встроенные в Java 8 и позже. УвидетьTutorial by Oracle. Basil Bourque
Пожалуйста, отправьте код, который на самом деле будет компилироваться. ВашtoString() Метод не возвращает строку, и вы не можете вызвать конструктор, подобный этому. Неясно, чего вы пытаетесь достичь. Пожалуйста, прочитайтеtinyurl.com/so-hints и уточни свой вопрос. Jon Skeet

Ваш Ответ

11   ответов
0
  1. if you are use using notepad: then

    public String toString(){
    
     return ""; ---now here you can use variables which you have created for your class
    
    }
    
  2. if you are using eclipse IDE then press

    -alt +shift +s 
    

    -click on override toString method here you will get options to select what type of variables you want to select.

0

На мой взгляд, лучший способ - использовать библиотеку Google gson:

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

или Apache Commons Lang отражение пути

8

Java toString () метод

Если вы хотите представить какой-либо объект в виде строки, метод toString () появляется.

Метод toString () возвращает строковое представление объекта.

Если вы печатаете какой-либо объект, компилятор Java внутренне вызывает метод toString () для объекта. Поэтому переопределение метода toString () возвращает желаемый результат, это может быть состояние объекта и т. Д., Зависит от вашей реализации.

Преимущество метода Java toString ()

Переопределяя метод toString () класса Object, мы можем возвращать значения объекта, поэтому нам не нужно писать много кода.

Вывод без метода 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]

Вы можете увидеть в приведенном выше примере № 1. печать s1 и s2 печатает значения Hashcode объектов, но я хочу напечатать значения этих объектов. Поскольку компилятор Java внутренне вызывает метод toString (), переопределение этого метода вернет указанные значения. Давайте поймем это на примере, приведенном ниже:

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

Обратите внимание, что toString () в основном относится к концепции полиморфизма в Java. В Eclipse попытайтесь щелкнуть по toString () и щелкнуть по нему правой кнопкой мыши. Затем щелкните по «Открытое объявление» и посмотрите, откуда взялся суперкласс toString ().

0

Если вы заинтересованы в модульных тестах, вы можете объявить общедоступный «ToStringTemplate», а затем выполнить модульное тестирование своей toString. Даже если вы не тестируете его модульно, я думаю, что он "чище" и использует String.format.

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());
    } 
}

Теперь вы можете выполнить модульное тестирование, создав Kid, задав свойства и выполнив свой собственный string.format для ToStringTemplate и сравнив.

создание статического финала ToStringTemplate означает «ОДНА ВЕРСИЯ»; правды, вместо того, чтобы иметь «копию» шаблона в модульном тесте.

109

toString должен вернутьString.

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

Я предлагаю вам использовать возможности вашей IDE для созданияtoString метод. Не кодируйте его вручную.

Например, Eclipse может сделать это, если просто щелкнуть правой кнопкой мыши по исходному коду и выбратьSource > Generate toString

Это не очень хорошая практика, так как вы используете конкатенацию строк.
StringBuilder - лучший выбор в такой ситуации.
В Netbeans; это подSource -> Insert Code... затем выберитеtoString
@Amit Компилятор Java используетStringBuilder неявно. Нет проблем, если вы не используете его в цикле.
0

Как объяснили другие,toString это не место для создания экземпляров вашего класса. Вместо этогоtoString Метод предназначен для построения строки, представляющей значение экземпляра вашего класса, с отчетом по крайней мере о наиболее важных полях данных, хранящихся в этом объекте. В большинстве случаев,toString используется для отладки и ведения журнала, а не для вашей бизнес-логики.

StringJoiner

Начиная с Java 8 и выше, самый современный способ реализацииtoString будет использоватьStringJoiner учебный класс.

Что-то вроде этого:

@Override
public String toString ()
{
    return new StringJoiner( " | " , Person.class.getSimpleName() + "[ " , " ]" )
            .add( "name=" + name )
            .add( "phone=" + phone )
            .toString();
}

Person[ name=Alice | phone=555.867.5309 ]

2

Следующий код является примером. Вопрос, основанный на том же самом, вместо использования преобразования на основе IDE, есть ли более быстрый способ реализации, чтобы в будущем происходили изменения, нам не нужно было изменять значения снова и снова?

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

Вы можете создать новый объект в toString (). использование

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

вместо

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

Вы можете изменить возвращаемую строку при необходимости. Есть и другие способы сохранить дату вместо каландра.

3

Вы не можете вызвать конструктор, как если бы это был обычный метод, вы можете вызвать его только с помощьюnew создать новый объект:

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

Но создание нового объекта из вашего метода toString () - это не то, что вы хотите делать.

1

Ну, на самом деле вам нужно будет вернуть что-то вроде этого, потому что toString должен вернуть строку

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

и вы действительно делаете что-то не так в конструкторе, вы устанавливаете переменную, которую пользователь установил на имя, в то время как вам нужно сделать обратное. Что вы не должны делать

n = this.name

Что ты должен делать

this.name = n

Надеется, что это помогает, спасибо

1

мы можем даже написать так, создав новый объект String в классе и присвоив ему то, что мы хотим в конструкторе, и вернем его в метод toString, который переопределен

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()  
 }  
}

Похожие вопросы