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()
개체를 비교할 때, 포함enum
s. 다음 설명도 참조하십시오.
Java 열거 멤버 비교: == 또는 equals()?
언급URL : https://stackoverflow.com/questions/533922/is-it-ok-to-use-on-enums-in-java
'programing' 카테고리의 다른 글
소수점 두 자리 숫자 표시 (0) | 2022.09.25 |
---|---|
MariaDB : 두 점 사이의 거리(km)를 계산합니다. (0) | 2022.09.25 |
Laravel 메일: 보기 대신 문자열 전달 (0) | 2022.09.25 |
타이프스크립트 내보내기 vs. 기본 내보내기 (0) | 2022.09.25 |
Windows에서 Python script as a Service를 실행하는 방법은 무엇입니까? (0) | 2022.09.25 |