programing

Java의 enum에서 ==를 사용해도 됩니까?

goodcopy 2022. 9. 25. 22:57
반응형

Java의 enum에서 ==를 사용해도 됩니까?

==의 enum을 ?.equals()==항상 먹히긴 하는데, 장담할 수 있을지 모르겠어요., 없, 없, 없, in, 없, 없, 없, 없, 없..clone()를 지정하기 수 알 수 없습니다..equals()와는 다른 값을 반환한다.==.

예를 들어, 다음과 같이 해도 될까요?

public int round(RoundingMode roundingMode) {
  if(roundingMode == RoundingMode.HALF_UP) {
    //do something
  } else if (roundingMode == RoundingMode.HALF_EVEN) {
    //do something
  }
  //etc
}

아니면 이렇게 써야 하나요?

public int round(RoundingMode roundingMode) {
  if(roundingMode.equals(RoundingMode.HALF_UP)) {
    //do something
  } else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
    //do something
  }
  //etc
}

내 2센트만:다음은 Sun에 의해 공개된Enum.java 코드와 JDK의 일부를 나타냅니다.

public abstract class Enum<E extends Enum<E>>
    implements Comparable<E>, Serializable {

    // [...]

    /**
     * Returns true if the specified object is equal to this
     * enum constant.
     *
     * @param other the object to be compared for equality with this object.
     * @return  true if the specified object is equal to this
     *          enum constant.
     */
    public final boolean equals(Object other) { 
        return this==other;
    }


}

예, ==은(는) 괜찮습니다. 각 값에 대해 하나의 참조만 있을 수 있습니다.

그러나 라운드 메서드를 쓰는 더 좋은 방법이 있습니다.

public int round(RoundingMode roundingMode) {
  switch (roundingMode) {
    case HALF_UP:
       //do something
       break;
    case HALF_EVEN:
       //do something
       break;
    // etc
  }
}

이 기능을 열거형 안에 넣는 것이 훨씬 더 좋은 방법입니다.그러면 전화만 하면 됩니다.roundingMode.round(someValue)이것은 Java enum의 핵심이 됩니다.다른 곳에서 볼 수 있는 "이름 있는 값"는 달리 객체 지향 enum입니다.

편집: 사양은 명확하지 않지만 섹션 8.9에는 다음과 같이 기술되어 있습니다.

열거형식의 본문에는 열거형 상수가 포함될 수 있습니다.열거형 상수는 열거형 인스턴스를 정의합니다.열거형에는 열거형 상수에 의해 정의된 인스턴스 이외의 인스턴스가 없습니다.

예, 이는 열거형 각 값에 대해 싱글톤 인스턴스를 작성한 것과 같습니다.

공개 추상 클래스 반올림 모드 {퍼블릭 스태틱 최종 반올림 모드 HALF_UP = 새 라운딩 모드();퍼블릭 스태틱 최종 반올림 모드 HALF_EVEN = 새로운 반올림 모드();
프라이빗 라운딩 모드() {// 개인 스코프가 이 클래스 이외의 서브 타입을 차단합니다.}}

,enum가지 .

  • 각 인스턴스의 toString()은 코드로 지정된 이름을 인쇄합니다.
  • (게시물에서 와 같이) 는 (보다 더 많이)를 할 수 switch-case제어 구조
  • 내의 은 를 하여 할 수 .values '생성입니다.
  • 다음은 ID 비교에 관한 큰 내용입니다.Enum 값은 클로닝 없이 시리얼라이제이션에서 살아남습니다.

그 연재물은 큰 골칫거리야.열거형 대신 위의 코드를 사용하는 경우 ID 평등은 다음과 같이 동작합니다.

RoundingMode 원본 = RoundingMode.하프 업assert(라운딩 모드).HALF_UP == 원본); // 합격
ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = 새로운 ObjectOutputStream(baos);
oos.write Object(오리지널);
oos.param();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = 새로운 ObjectInputStream(bais);
반올림 모드 역직렬화 = (Rounding Mode) ois.readObject();
assert(라운딩 모드).HALF_UP == 역직렬화됨), // 실패assert(라운딩 모드).HALF_EVEN == 역직렬화됨), // 실패

이 문제는 열거 없이 해결할 수 있습니다.writeReplace그리고.readResolve, (http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html) 를 참조해 주세요.

요점은 Java는 열거값의 아이덴티티를 사용하여 동등성을 검증할 수 있도록 하는 것입니다.이것은 권장되는 프랙티스입니다.

==는 두 개체의 참조를 비교합니다.enum의 경우 인스턴스가 하나뿐이므로 동일한 두 enum에 대해 ==가 적용됩니다.

레퍼런스:

http://www.ajaxonomy.com/2007/java/making-the-most-of-java-50-enum-tricks

(Sun 문서에서 아무것도 찾을 수 없음)

여기 당신이 흥미를 느낄 수 있는 몇 가지 악성코드가 있습니다. : D

public enum YesNo {YES, NO}

public static void main(String... args) throws Exception {
    Field field = Unsafe.class.getDeclaredField("theUnsafe");
    field.setAccessible(true);
    Unsafe unsafe = (Unsafe) field.get(null);
    YesNo yesNo = (YesNo) unsafe.allocateInstance(YesNo.class);

    Field name = Enum.class.getDeclaredField("name");
    name.setAccessible(true);
    name.set(yesNo, "YES");

    Field ordinal = Enum.class.getDeclaredField("ordinal");
    ordinal.setAccessible(true);
    ordinal.set(yesNo, 0);

    System.out.println("yesNo " + yesNo);
    System.out.println("YesNo.YES.name().equals(yesNo.name()) "+YesNo.YES.name().equals(yesNo.name()));
    System.out.println("YesNo.YES.ordinal() == yesNo.ordinal() "+(YesNo.YES.ordinal() == yesNo.ordinal()));
    System.out.println("YesNo.YES.equals(yesNo) "+YesNo.YES.equals(yesNo));
    System.out.println("YesNo.YES == yesNo " + (YesNo.YES == yesNo));
}

에넘은 다형 코드를 막기에 좋은 장소입니다.

enum Rounding {
  ROUND_UP {
    public int round(double n) { ...; }
  },
  ROUND_DOWN {
    public int round(double n) { ...; }
  };

  public abstract int round(double n);
}

int foo(Rounding roundMethod) {
  return roundMethod.round(someCalculation());
}

int bar() {
  return foo(Rounding.ROUND_UP);
}

RMI/IIOP를 통해 열거형을 전송할 때 문제가 발생한다는 점에 유의하십시오.다음 스레드를 참조하십시오.

http://www.velocityreviews.com/forums/t390342-enum-equality.html

==는 일반적으로 괜찮으며 ==와 == 모두에 장점이 있습니다..equals()저는 개인적으로 항상 사용하는 것을 선호합니다..equals()개체를 비교할 때, 포함enums. 다음 설명도 참조하십시오.

Java 열거 멤버 비교: == 또는 equals()?

언급URL : https://stackoverflow.com/questions/533922/is-it-ok-to-use-on-enums-in-java

반응형