programing

Java에서 toString()을 올바르게 덮어쓰려면 어떻게 해야 합니까?

procenter 2023. 2. 2. 21:58
반응형

Java에서 toString()을 올바르게 덮어쓰려면 어떻게 해야 합니까?

멍청하게 , 내해.toString()매우 귀찮은 방법입니다.toString' #도 ' 컨스트럭터 #2'를가 없는키드 컨스트럭터 #2'가 있는데도 '키드 컨스트럭터 #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(즉, 세 번째 파라미터는 off이며 String이어야 합니다)은 off입니다.세 번째 값을 하드코드로 지정하면 이 값을 찾을 수 없다고 표시됩니다(위).그럼 어떻게 날짜를 잡고 헤어질 수 있죠?

이것을 호출하는 클래스는 다음과 같습니다.

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  

여러 건설업자를 조사해 봤지만 별 도움이 되지 않았어요.는 사사 i i사inging i 。toString() 방법을 사용하여했습니다.toString()메서드 로직은 제가 예전에 만든 건데 이건 완전히 새로운 거라서 전혀 안 먹혔어요.

헬프?

toString 있습니다.String.

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

하여 IDE를 하는 것이 .toString 하지 마세요츠미야

를 들어,는 소스 버튼으로 하고 Eclipse를 선택하면 됩니다.Source > Generate toString

Java toString() 메서드

오브젝트를 문자열로 나타내려면 toString() 메서드가 필요합니다.

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

오브젝트를 인쇄하면 Java 컴파일러는 내부적으로 오브젝트의 toString() 메서드를 호출합니다.따라서 toString() 메서드를 덮어쓰면 원하는 출력이 반환됩니다.실장에 따라 오브젝트 상태 등이 달라집니다.

Java toString() 메서드의 이점

오브젝트 클래스의 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를 인쇄하면 객체의 해시 코드 값이 인쇄되지만 이러한 객체의 값을 인쇄하고 싶습니다.Java 컴파일러는 내부적으로 String() 메서드를 호출하므로 이 메서드를 덮어쓰면 지정된 값이 반환됩니다.아래에 제시된 예시로 이를 이해하겠습니다.

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의 다형성 개념과 관련되어 있습니다.이클립스에서는 toString()을 클릭하여 오른쪽 클릭합니다.그런 다음 Open Declaration을 클릭하여 Superclass toString()의 출처를 확인합니다.

하듯이, 이 책은toString수업을 인스턴스화 할 수 있는 장소가 아닙니다. toString메서드는 클래스의 인스턴스 값을 나타내는 문자열을 작성하고 해당 개체에 저장된 데이터의 가장 중요한 필드에 대해 보고합니다.의 경우, 「」는,toString는 비즈니스 로직이 아닌 디버깅 및 로깅에 사용됩니다.

사용자에게 표시할 개체의 값을 나타내는 텍스트를 생성하려면 다른 메서드를 추가합니다.사람들은 종종 그 방법의 이름을 다음과 같이 짓는다.getDisplayName예를 들어, 및 등입니다.

StringJoiner

8을 구현하는 toString수업이 필요할 거예요.의사 선생님 말씀대로:

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

개인[이름=]앨리스 | 전화 = 555.867.5309 ]

record

Java 16은 데이터를 투명하고 불변하게 통신하는 것이 주요 목적인 클래스를 간략하게 정의하는 새로운 방법을 제공합니다. 바로 레코드입니다.

레코드를 정의하려면 각 멤버필드의 유형과 이름을 나열하기만 하면 됩니다. getters, getters를 암묵적으로 합니다.equals&hashCode , , , , 입니다.toString.

" " " 」toString

「」toString에는 각 멤버필드가 포함됩니다.

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

다른 오브젝트와 마찬가지로 인스턴스화.

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

기본 구현을 자신의 구현으로 덮어쓸 수도 있습니다.보통 단순한 데이터 캐리어로서의 레코드의 목적을 고려할 때 오버라이드는 필요하지 않습니다.

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

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

대신

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

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

방법인 , 건설사를 수 있는 은 '만 있으면 된다'입니다. 이치노력하다new오브젝트를 하려면: ""를 선택합니다.

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

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

다음 코드는 샘플입니다.IDE 기반 변환을 사용하는 대신 나중에 변경 사항이 발생할 경우 값을 몇 번이고 수정할 필요가 없도록 구현하기 위한 더 빠른 질문입니다.

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

Unit-Tests에 관심이 있는 경우 ToStringTemplate를 공개 선언하고 ToString을 유닛테스트할 수 있습니다.유닛 테스트를 하지 않아도 "더 깨끗하다"고 생각하고 String을 사용합니다.포맷합니다.

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

이제 키드를 만들고 속성을 설정한 후 직접 문자열을 실행하여 테스트를 유닛화할 수 있습니다.ToStringTemplate 형식 및 비교.

ToStringTemplate static-final은 유닛 테스트에서 템플릿의 "복사"가 아닌 진실의 "하나의 버전"을 의미합니다.

toString은 문자열을 반환해야 하기 때문에 실제로 이와 같은 것을 반환해야 합니다.

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

사용자가 설정한 변수를 이름으로 설정할 때 컨스트럭터에서 실제로 잘못된 작업을 수행하게 됩니다.하지 말아야 할 일

n = this.name

해야 할 일

this.name = n

이것이 감사에 도움이 되기를 바랍니다.

클래스에서 새로운 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()  
 }  
}

롬복 주석을 사용하는 것이 좋고 간결한 방법이다.정말 그랬어요.@ToString주석: 이 주석으로 인해 구현이 생성됩니다.toString()방법.기본적으로는 클래스 이름과 각 필드가 쉼표로 구분되어 순서대로 인쇄됩니다.다음과 같이 주석에 파라미터를 전달하여 출력을 쉽게 사용자 정의할 수 있습니다.

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

순수 Java에 해당하는 것은 다음과 같습니다.

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

toString()DTO 디버깅에서는 다음과 같은 방법으로 사람이 판독할 수 있는 출력을 자동으로 생성할 수 있습니다.

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

단, DTO에 PII가 포함되어 있는 경우(로그에 기록해서는 안 됩니다) 실가동 환경에 적합하지 않습니다.

항상 간단한 방법을 사용합니다.우클릭> [ Generate ]> [ toString ]() >여기에 이미지 설명 입력

가장 좋은 방법은 구글 gson 라이브러리를 사용하는 것입니다.

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

또는 Apache 공통 언어 반사 방식

  1. 메모장을 사용하는 경우:

    public String toString(){
    
     return ""; ---now here you can use variables which you have created for your class
    
    }
    
  2. 이클립스 IDE를 사용하는 경우 를 누릅니다.

    -alt +shift +s 
    

    override toString 메서드를 클릭하면 선택할 변수 유형을 선택할 수 있는 옵션이 나타납니다.

언급URL : https://stackoverflow.com/questions/10734106/how-to-override-tostring-properly-in-java

반응형