Подтвердить что ты не робот

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

Звучит немного глупо, но мне нужна помощь в моем методе toString(), и это очень раздражает. Я попытался поискать в Интернете, потому что toString - тот, где он облажается и "не находит конструктора Кида №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 выше (я знаю, мой третий параметр выключен, должна быть строкой) выключена. Если я жестко закодирую значение для третьей вещи, он становится бесполезным и говорит, что не может найти это (см. выше). Так как я могу получить дату и разбить ее?

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

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(), которую я создал предыдущей, но она совершенно новая, поэтому она никогда не работала.

Помогите?

4b9b3361

Ответ 1

Предполагается, что toString возвращает String.

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

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

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

Ответ 2

Метод 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() и щелкнуть правой кнопкой мыши по нему. Затем нажмите "Открыть декларацию" и посмотрите, откуда появился Superclass toString().

Ответ 3

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

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

вместо

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

n = this.name

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

this.name = n

Надеюсь, это поможет спасибо

Ответ 7

мы можем даже писать так, создавая новый объект 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()  
 }  
}

Ответ 8

Если вас интересуют юнит-тесты, вы можете объявить публичный "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 означает "ОДНУ ВЕРСИЮ" истины, вместо того, чтобы иметь "копию" шаблона в модульном тесте.

Ответ 9

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

Чтобы сгенерировать текст, представляющий значение объекта для отображения пользователю, добавьте другой метод. Люди часто называют метод что-то вроде getDisplayName. Например, DayOfWeek::getDisplayName и Month::getDisplayName.

StringJoiner

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

StringJoiner используется для создания последовательности символов, разделенных разделителем и, возможно, начиная с предоставленного префикса и заканчивая предоставленным суффиксом.

Используйте как это:

@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.
}

Person[ name=Alice | phone=555.867.5309 ]

Ответ 10

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

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

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

Ответ 11

  1. если вы используете с помощью блокнота:тогда

    public String toString(){
    
     return ""; ---now here you can use variables which you have created for your class
    
    }
    
  2. если вы используете Eclipse IDE, то нажмите

    -alt +shift +s 
    

    -click при переопределении метода toString здесь вы получите параметры для выбора типа переменных, которые вы хотите выбрать.