Android가 더 많은 열거 형을 사용하지 않는 이유는 무엇입니까?


79

몇 가지 이유로 내 코드에서 C # 및 Java 열거 형을 사용하는 것을 정말 좋아하기 시작했습니다.

  • 정수, 문자열 또는 부울 플래그 세트보다 훨씬 더 형식 안전합니다.
  • 더 읽기 쉬운 코드로 이어집니다.
  • 열거 형을 정수 또는 문자열보다 잘못된 값으로 설정하는 것이 더 어렵습니다.
  • 변수 또는 매개 변수에 허용되는 값을 쉽게 찾을 수 있습니다.
  • 내가 읽은 모든 것은 C #과 대부분의 JVM에서 정수만큼 성능이 있음을 나타냅니다.

그러나 Android 프레임 워크에는 다양한 유형의 플래그를 전달해야하는 많은 경우가 있지만 열거 형을 사용하는 경우는 없습니다. 내가 그들의 사용이 도움이 될 것이라고 생각 예 부부는 Toast.LENGTH_SHORT/ Toast.LENGTH_LONGView.GONE, View.VISIBLE

왜 이런거야? 열거 형은 Dalvik에서 단순한 정수 값보다 성능이 떨어 집니까? 내가 알지 못하는 다른 단점이 있습니까?


10
지금 enum을 사용해도 괜찮습니다. 참조 stackoverflow.com/questions/5143256/...
티에리 - 디미트리 로이

1
큰! 나는 열거 형을 좋아하고 아직 그것들을 꺼내지 않았습니다.
We Are All Monica

답변:


66

이 답변은 2011 년 3 월 현재가 아닙니다.

Enums는 Froyo 이상에서 사용할 수 있습니다 . Android VM 팀 (및 그의 블로그 ) 의 구성원이 작성한 이 답변 ( "Ints 만 필요한 곳에 Enums 사용 안 함"이 Android의 성능 팁에서 제거 된 이유는 무엇입니까? )에 따라 사용할 수 있습니다.


이전 답변 :

공식 Android 팀 권장 사항은 피할 수있을 때마다 열거 형을 피하는 것입니다.

열거 형은 매우 편리하지만 안타깝게도 크기와 속도가 중요 할 때 고통 스러울 수 있습니다. 예를 들면 다음과 같습니다.

public enum Shrubbery { GROUND, CRAWLING, HANGING }

3 개의 public static final int가있는 동등한 클래스와 비교하여 .dex 파일에 740 바이트를 추가합니다. 처음 사용할 때 클래스 이니셜 라이저는 열거 된 각 값을 나타내는 개체에서 메서드를 호출합니다. 각 개체는 고유 한 정적 필드를 가져오고 전체 집합은 배열 ( "$ VALUES"라는 정적 필드)에 저장됩니다. 그것은 단지 세 개의 정수에 대한 많은 코드와 데이터입니다. 또한 이것은 :

Shrubbery shrub = Shrubbery.GROUND;

정적 필드 조회가 발생합니다. "GROUND"가 static final int이면 컴파일러는이를 알려진 상수로 처리하고 인라인합니다.

출처 : Int 만 필요한 경우 Enums 피하기


4
따라서 C # 열거 형 매우 잘 수행되지만 Java 열거 형은 더 복잡하기 때문에 그렇지 않습니다. 그러므로 나의 마지막 요점은 사실이 아닙니다. 옳은?
We Are All Monica

25
이것은 더 이상 아마 유효하지 않은 참조 stackoverflow.com/questions/5143256/...
빅토르 달

2
Android 문서에서는 여전히 enum을 사용하지 말 것을 권장합니다. " Enum은 종종 정적 상수보다 두 배 이상의 메모리를 필요로합니다. Android에서 enum을 사용하는 것은 엄격히 피해야합니다." developer.android.com/training/articles/memory.html#Overhead
ThomasW

1
@ SebastianPaaskeTørholm 제공하신 링크 (this : developer.android.com/guide/practices/design/… )가 더 이상 팁을 표시하지 않습니다.
안드로이드 개발자

14

정수는 더 작고, 더 적은 오버 헤드를 필요로하며, 이는 모바일 장치에서 여전히 중요합니다.


또한 이제 Android Studio 및 Lint를위한 좋은 도구가 있습니다. 나는 평균 주석 IntDefStringDef어떤 종류의 선언 할 수 있도록, 타입 정의를 INT 상수의 사용이 매우 편리합니다, 그래서. blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.

예,하지만 Retrofit 모델은 어떻습니까? (그리고 내가 생각하는 다른 네트워크 라이브러리의 경우) POJO에 직접 매핑하기 위해 상태 응답 (예 : 성공, 실패, token_expired)을 어떻게 정의 하시겠습니까?
mitsest

5

내 동료가이 상황에 대해 작은 테스트를 수행했습니다. 그는 동일한 양의 "열거 형"으로 a class와 an enum을 자동으로 생성했습니다 . 나는 그가 30000 항목을 생성했다고 생각합니다.

결과는 다음과 같습니다.

  • .class(가)에 대한 class대략이었다 1천2백킬로바이트
  • .class(가)에 대한 enum대략이었다 8백킬로바이트

이것이 누군가를 돕기를 바랍니다.


나는 그것이 유효한 테스트라고 생각하지 않습니다. 단일 위치에 30000 개의 열거 형 / 정적 필드를 갖는 것은 현실적인 시나리오가 아닙니다. 많은 수의 작은 클래스 / 열거 형 (예 : 1000 개의 클래스 / 열거 형)의 크기를 각각 30 개의 속성을 비교해야합니다. 나는 전체 크기가 상당히 다를 것이라고 확신합니다.
Iwo Banas 2012 년

7
@Iwo Banas 모든 테스트는 유효한 테스트입니다. 질문에 답할 것이라고 말하지 않았습니다. 관심이있는 사람에게 추가 정보로 제공했습니다. 그리고 반대표는 매우 당연한 것 같습니다. 감사합니다. -_-
prolink007

그 반대가 아닌가? 그 열거 형은 덜 사용합니까? 그리고 1200KB 또는 800KB의 메모리 또는 스토리지입니까?
안드로이드 개발자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.