[java] Java에서 toString ()을 올바르게 재정의하는 방법은 무엇입니까?

약간 어리석은 것 같지만 내 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 

Ok 위의 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()만든 이전 방법 논리를 사용해 보았지만 이것은 완전히 새로운 것이므로 작동하지 않았습니다.

도움?



답변

toString를 반환 할 예정이다 String.

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

toString방법 을 생성하기 위해 IDE의 기능을 사용하는 것이 좋습니다 . 직접 코딩하지 마십시오.

예를 들어 Eclipse는 소스 코드를 마우스 오른쪽 버튼으로 클릭하고 Source > Generate toString


답변

Java toString () 메서드

객체를 문자열로 나타내려면 toString () 메서드가 존재합니다.

toString () 메서드는 객체의 문자열 표현을 반환합니다.

객체를 인쇄하는 경우 Java 컴파일러는 객체에 대해 내부적으로 toString () 메서드를 호출합니다. 따라서 toString () 메서드를 재정의하고 원하는 출력을 반환합니다. 이는 구현에 따라 객체의 상태 등이 될 수 있습니다.

Java toString () 메소드의 장점

Object 클래스의 toString () 메서드를 재정의하면 객체의 값을 반환 할 수 있으므로 많은 코드를 작성할 필요가 없습니다.

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:Student@2kaa9dc
       Student@4bbc148

위의 예 # 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 ()을 클릭하고 마우스 오른쪽 버튼을 클릭 한 다음 Open Declaration을 클릭하고 슈퍼 클래스 toString ()의 출처를 확인합니다.


답변

toString ()에서 새 객체를 만들 수 있습니다. 사용하다

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

대신에

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

필요에 따라 반환 문자열을 변경할 수 있습니다. calander 대신 날짜를 저장하는 다른 방법이 있습니다.


답변

생성자를 일반 메서드 인 것처럼 호출 할 수 없습니다 new. 새 객체를 만들 때만 호출 할 수 있습니다 .

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

그러나 toString () 메서드에서 새 객체를 생성하는 것은 원하는 작업이 아닙니다.


답변

다른 사람들이 설명했듯이 toString클래스를 인스턴스화하는 곳이 아닙니다. 대신이 toString메서드는 클래스 인스턴스의 값을 나타내는 문자열을 작성하여 해당 개체에 저장된 데이터의 가장 중요한 필드를보고합니다. 대부분의 경우 toString비즈니스 로직이 아닌 디버깅 및 로깅에 사용됩니다.

사용자에게 표시 할 개체의 값을 나타내는 텍스트를 생성하려면 다른 메서드를 추가합니다. 사람들은 종종 방법을 getDisplayName. 예를 들어 DayOfWeek::getDisplayNameMonth::getDisplayName.

StringJoiner

Java 8 이상에서 가장 현대적인 구현 방법 toStringStringJoiner클래스를 사용하는 것 입니다. 문서에 따르면 :

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

사람 [name = Alice | phone = 555.867.5309]


답변

다음 코드는 샘플입니다. IDE 기반 변환을 사용하는 대신 동일한 기반의 질문으로 구현하는 더 빠른 방법이있어 향후 변경 사항이 발생하여 값을 반복해서 수정할 필요가 없습니까?

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


답변

단위 테스트에 관심이 있다면 공용 “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를 만들고, 속성을 설정하고, ToStringTemplate에서 자신 만의 string.format을 수행하고 비교하여 단위 테스트를 할 수 있습니다.

ToStringTemplate을 static-final로 만드는 것은 단위 테스트에서 템플릿의 “복사본”을 갖는 것이 아니라 진실의 “한 버전”을 의미합니다.