[android] Android가 더 많은 열거 형을 사용하지 않는 이유는 무엇입니까?
몇 가지 이유로 내 코드에서 C # 및 Java 열거 형을 사용하는 것을 정말 좋아하기 시작했습니다.
- 정수, 문자열 또는 부울 플래그 세트보다 훨씬 더 형식 안전합니다.
- 더 읽기 쉬운 코드로 이어집니다.
- 열거 형을 정수 또는 문자열보다 잘못된 값으로 설정하는 것이 더 어렵습니다.
- 변수 또는 매개 변수에 허용되는 값을 쉽게 찾을 수 있습니다.
- 내가 읽은 모든 것은 C #과 대부분의 JVM에서 정수만큼 성능이 있음을 나타냅니다.
그러나 Android 프레임 워크에는 다양한 유형의 플래그를 전달해야하는 많은 경우가 있지만 열거 형을 사용하는 경우는 없습니다. 내가 그들의 사용이 도움이 될 것이라고 생각 예 부부는 Toast.LENGTH_SHORT
/ Toast.LENGTH_LONG
와 View.GONE
, View.VISIBLE
등
왜 이런거야? 열거 형은 Dalvik에서 단순한 정수 값보다 성능이 떨어 집니까? 내가 알지 못하는 다른 단점이 있습니까?
답변
이 답변은 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이면 컴파일러는이를 알려진 상수로 처리하고 인라인합니다.
답변
정수는 더 작고, 더 적은 오버 헤드를 필요로하며, 이는 모바일 장치에서 여전히 중요합니다.
답변
내 동료가이 상황에 대해 작은 테스트를 수행했습니다. 그는 동일한 양의 “열거 형”으로 a class
와 an enum
을 자동으로 생성했습니다
. 나는 그가 30000 항목을 생성했다고 생각합니다.
결과는 다음과 같습니다.
.class
(가)에 대한class
대략이었다 1천2백킬로바이트.class
(가)에 대한enum
대략이었다 8백킬로바이트
이것이 누군가를 돕기를 바랍니다.