programing

Java enum - 이름 대신 toString을 사용하는 이유

prostudy 2022. 7. 28. 22:07
반응형

Java enum - 이름 대신 toString을 사용하는 이유

enum api에서 메서드를 보면 다음과 같이 표시됩니다.

열거 선언에 선언된 대로 이 열거 상수의 이름을 반환합니다.대부분의 프로그래머는 toString 메서드가 보다 사용하기 쉬운 이름을 반환할 수 있기 때문에 이 메서드보다 먼저 toString 메서드를 사용해야 합니다.이 방법은 주로 릴리스마다 달라지지 않는 정확한 이름을 얻어야 하는 특수한 상황에서 사용하도록 설계되었습니다.

사용하는 것이 좋은 이유toString()toString은 name()이 이미 최종일 때 덮어쓸 수 있습니다.따라서 toString을 사용할 때 누군가가 이를 덮어쓰고 하드 코드화된 값을 반환하면 전체 응용 프로그램이 다운됩니다.또, 송신원을 참조하면, toString() 메서드는 이름만을 반환합니다.똑같은 겁니다.

반환되는 값으로 무엇을 할지에 따라 달라집니다.

  • 열거 상수를 선언하는 데 사용되는 정확한 이름을 얻으려면 다음을 사용하십시오.name()~하듯이toString덮어쓰기되었을지도 모른다
  • 사용자 친화적인 방법으로 열거 상수를 인쇄하려면toString덮어쓰기(또는 덮어쓰기)되었을 가능성이 있습니다.

혼란스러울 수 있다고 생각되는 경우, 저는 보다 구체적인 정보를 제공합니다.getXXX예를 들어 다음과 같습니다.

public enum Fields {
    LAST_NAME("Last Name"), FIRST_NAME("First Name");

    private final String fieldDescription;

    private Fields(String value) {
        fieldDescription = value;
    }

    public String getFieldDescription() {
        return fieldDescription;
    }
}

사용하다name()비교하거나 하드코드된 값을 사용하여 코드에서 내부 사용을 원할 때 사용합니다.

사용하다toString()사용자에게 정보를 표시하는 경우(로그를 참조하는 디벨로퍼를 포함한다).절대 코드를 신뢰하지 마십시오.toString()특정 값을 제공합니다.특정 문자열에 대해 테스트하지 마십시오.다른 사용자가 올바르게 변경했을 때 코드가 깨진 경우toString()다시 돌아왔을 때 이미 망가져 있었어요

javadoc(강조 광산)에서:

개체의 문자열 표현을 반환합니다.일반적으로 toString 메서드는 이 개체를 텍스트로 나타내는 문자열을 반환합니다.그 결과는 간결하지만 사람이 읽기 쉬운 유익한 표현이 되어야 한다.모든 서브클래스는 이 메서드를 덮어쓰는 것이 좋습니다.

name()의 "내장" 방식입니다.enum최종적인 것으로, 실장을 변경할 수 없습니다.입력 시 열거 상수의 이름을 반환합니다(예: 대문자, 공백 없음).

MOBILE_PHONE_NUMBER ★★★★★★★★★★★★★★★★★」Mobile phone number떤떤버 전전 ??? ????나는 두 번째 것을 믿는다.입니다.name() 반환하다MOBILE_PHONE_NUMBER,toString() 반환할 수 Mobile phone number.

대부분의 사람들이 javadoc의 조언을 맹목적으로 따르지만 실제로 toString()을 피하고 싶은 매우 구체적인 상황이 있습니다.예를 들어 Java 코드에서 enum을 사용하고 있는데 데이터베이스로 시리얼화했다가 다시 돌아와야 합니다.만약 내가 String()에 사용했다면, 기술적으로 다른 사람들이 지적한 것처럼 오버라이드 동작을 얻을 수 있을 것입니다.

또, 데이타베이스로부터의 시리얼화를 해제할 수도 있습니다.예를 들어, 이것은 Java 로 항상 동작합니다.

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());

단, 이것은 보증되지 않습니다.

MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());

덧붙여서 자바독이 "대부분의 프로그래머가 해야 한다"고 명시적으로 말하는 것은 매우 이상하다고 생각합니다.enum의 toString에는 매우 적은 use-case가 있습니다.만약 사람들이 그것을 i18n과 호환성이 있는 것을 사용해야 하기 때문에 확실히 좋지 않은 use-case로 사용하고 있다면, 대부분의 경우 name() 메서드를 사용합니다.

name()과 toString()이 다르다고 생각되는 실제 예로는 단일값 열거형을 사용하여 싱글톤을 정의하는 패턴을 들 수 있습니다.처음에는 의외로 보이지만, 매우 일리가 있습니다.

enum SingletonComponent {
    INSTANCE(/*..configuration...*/);

    /* ...behavior... */

    @Override
    String toString() {
      return "SingletonComponent"; // better than default "INSTANCE"
    }
}

이 경우:

SingletonComponent myComponent = SingletonComponent.INSTANCE;
assertThat(myComponent.name()).isEqualTo("INSTANCE"); // blah
assertThat(myComponent.toString()).isEqualTo("SingletonComponent"); // better

name()은 문자 그대로 열거형 Java 코드의 텍스트 이름입니다.이는 Java 코드에 실제로 표시될 수 있는 문자열로 제한되지만 모든 바람직한 문자열이 코드로 표현되는 것은 아니라는 것을 의미합니다.예를 들어 숫자로 시작하는 문자열이 필요할 수 있습니다.name()은 해당 문자열을 얻을 수 없습니다.

아래의 코드와 같은 것을 사용할 수도 있습니다.나는 게터 및 컨스트럭터의 보일러 플레이트 코드를 쓰는 것을 피하기 위해 롬복(lombok)을 사용했다.

@AllArgsConstructor
@Getter
public enum RetroDeviceStatus {
    DELIVERED(0,"Delivered"),
    ACCEPTED(1, "Accepted"),
    REJECTED(2, "Rejected"),
    REPAIRED(3, "Repaired");

    private final Integer value;
    private final String stringValue;

    @Override
    public String toString() {
        return this.stringValue;
    }
}

언급URL : https://stackoverflow.com/questions/13291076/java-enum-why-use-tostring-instead-of-name

반응형