programing

toString()을 구현할 때 reflection을 사용하는 것이 의미가 있습니까?

mailnote 2023. 4. 1. 09:42
반응형

toString()을 구현할 때 reflection을 사용하는 것이 의미가 있습니까?

@Override 
public String toString() { 
    return new Gson().toJson(this);
}

모델 오브젝트의 디폴트 동작으로서 「조슈아 패턴」, 「일반 디자인 패턴」, 또는 그 외의 규약을 위반하고 있는 것일까요.

toString()어쨌든 현재 사용하고 있는 패러다임(Android)의 디버깅에만 사용됩니다.이것이 바로 제가 JSON에서 오브젝트를 보는 것을 좋아하는 이유이기도 합니다.이는 많은 ORM/json 지속성이 http->php/python->mysql과 로컬 SQLite를 통해 발생하기 때문입니다.

네. GSON/Jackson/Reflections 라이브러리를 사용하여 toString() 메서드를 구현해도 괜찮습니다.

toString 메서드를 구현하는 방법은 거의 없습니다.

  1. 리플렉션(Apache 라이브러리)

    @Override
    public String toString(){
        return org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(this);
    }
    
  2. JSON 기반 구현(GSON, Jackson 라이브러리)

    // GSON library for JSON
    @Override
    public String toString(){
        return new com.google.gson.Gson().toJson(this);
    }
    
    // Jackson libabry for JSON/YAML
    @Override
    public String toString() {
        try {
            return new com.fasterxml.jackson.databind.ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
        } catch (com.fasterxml.jackson.core.JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
    
  3. ToStringBuilder(apache-commons 라이브러리에서 사용 가능)

    @Override
    public String toString() {
        return new org.apache.commons.lang3.builder.ToStringBuilder(this).
            append("field1", field1).
            append("field2", field2).
            toString();
    }
    
  4. 하드코어 toString() 실장

    @Override
    public String toString() {
        return new StringBuilder()
            .append("field1:"+field1)
            .append("field2:"+field2)
            .toString();
    }
    
  5. Lombok 주석 : 컴파일 시 toString()을 생성합니다.

    import lombok.ToString;
    
    @ToString
    public class ToStringExample {}
    

이렇게 해도 나쁠 건 없다.이 경우, 데이터 전송에 대한 정적 변수를 생성할 것을 제안합니다.Gson예를 들어 예쁜 인쇄를 활성화합니다.

static Gson gson = new GsonBuilder().setPrettyPrinting().create();

이 방법으로 출력은toString메서드가 포맷됩니다.

메모: 그 GSon 예쁜 인쇄를 toString() 메서드로 사용하면 새로운 행으로 가득 차기 때문에 디버거에서 가비지처럼 보일 수 있습니다.

(Sorry는 위에 언급할 만한 충분한 정보가 없습니다.)

Gson은 자기성찰을 사용하여 인쇄할 필드를 결정하기 때문에 성능에 좋지 않습니다.

그것 말고는 괜찮은 것 같아요.이는 표준 Java toString 구현은 아니지만, 이를 변경하는 것이 안티패턴이라고는 생각하지 않습니다.

언급URL : https://stackoverflow.com/questions/16527932/does-it-make-sense-to-use-reflection-when-implementing-tostring

반응형