Tại sao Android không sử dụng nhiều enum hơn?


79

Tôi bắt đầu thực sự thích sử dụng C # và Java enums trong mã của mình vì một số lý do:

  • Chúng an toàn về kiểu hơn nhiều so với số nguyên, chuỗi hoặc tập hợp các cờ boolean.
  • Chúng dẫn đến mã dễ đọc hơn.
  • Việc đặt enum thành một giá trị không hợp lệ sẽ khó hơn so với int hoặc string.
  • Chúng giúp bạn dễ dàng khám phá các giá trị được phép cho một biến hoặc tham số.
  • Mọi thứ tôi đã đọc chỉ ra rằng chúng hoạt động tốt như các số nguyên trong C # và hầu hết các JVM.

Tuy nhiên, khung công tác Android có rất nhiều trường hợp cần phải chuyển các loại cờ khác nhau, nhưng không có trường hợp nào trong số chúng dường như sử dụng enum. Một vài ví dụ mà tôi sẽ nghĩ việc sử dụng chúng sẽ có lợi là Toast.LENGTH_SHORT/ Toast.LENGTH_LONGView.GONE, View.VISIBLEvv

Tại sao thế này? Enums có hoạt động kém hơn các giá trị số nguyên đơn giản trong Dalvik không? Có một số nhược điểm khác mà tôi không biết?


10
Bây giờ có thể sử dụng enum. Xem stackoverflow.com/questions/5143256/...
Thierry-Dimitri Roy

1
Tuyệt quá! Tôi thích enums và tôi vẫn chưa tìm cách lấy chúng ra.
We Are All Monica,

Câu trả lời:


66

Câu trả lời này đã lỗi thời kể từ tháng 3 năm 2011.

Enums có thể được sử dụng trên Froyo trở lên - theo câu trả lời này ( Tại sao "Tránh Enums nơi bạn chỉ cần kiến" bị xóa khỏi mẹo hiệu suất của Android? ) Từ một thành viên của nhóm Android VM (và blog của anh ấy ).


Câu trả lời trước:

Khuyến nghị chính thức của nhóm Android là tránh enums bất cứ khi nào bạn có thể tránh được:

Enums rất tiện lợi, nhưng không may có thể gây đau đớn khi kích thước và tốc độ quan trọng. Ví dụ, điều này:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

thêm 740 byte vào tệp .dex của bạn so với lớp tương đương với ba int cuối cùng tĩnh công khai. Trong lần sử dụng đầu tiên, trình khởi tạo lớp gọi phương thức trên các đối tượng đại diện cho mỗi giá trị được liệt kê. Mỗi đối tượng nhận được trường tĩnh của riêng nó và tập hợp đầy đủ được lưu trữ trong một mảng (trường tĩnh được gọi là "$ VALUES"). Đó là rất nhiều mã và dữ liệu, chỉ dành cho ba số nguyên. Ngoài ra, điều này:

Shrubbery shrub = Shrubbery.GROUND;

gây ra tra cứu trường tĩnh. Nếu "GROUND" là một int cuối cùng tĩnh, trình biên dịch sẽ coi nó như một hằng số đã biết và nội dòng nó.

Nguồn: Tránh Enums Nơi bạn chỉ cần Ints


4
Vì vậy, trong khi C # enums làm thực hiện rất tốt, Java enums không vì chúng là phức tạp hơn. Do đó, gạch đầu dòng cuối cùng của tôi không thực sự đúng. Chính xác?
We Are All Monica,

25
Điều này có thể không còn hợp lệ nữa, hãy xem stackoverflow.com/questions/5143256/…
Viktor Dahl

2
Tài liệu Android vẫn khuyên không nên sử dụng enum: " Enum thường yêu cầu bộ nhớ nhiều hơn gấp đôi so với hằng số tĩnh. Bạn nên tránh tuyệt đối việc sử dụng enum trên Android." developer.android.com/training/articles/memory.html#Overhead
ThomasW

1
@ SebastianPaaskeTørholm Liên kết bạn đã cung cấp (cái này: developer.android.com/guide/practices/design/… ) không hiển thị mẹo nữa.
nhà phát triển android

14

Số nguyên nhỏ hơn và yêu cầu ít chi phí hơn, một điều vẫn quan trọng trên thiết bị di động.


Ngoài ra, bây giờ chúng tôi có công cụ tốt cho Android Studio và Lint. Ý tôi là chú thích IntDefStringDefcho phép khai báo một số loại typedef , vì vậy việc sử dụng hằng số int rất thuận tiện. blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.

vâng, nhưng còn các mô hình Trang bị thêm thì sao? (và đối với các thư viện mạng khác mà tôi cho là) ​​Bạn sẽ xác định phản hồi trạng thái như thế nào (ví dụ: thành công, không thành công, mã thông báo đã hết hạn) để ánh xạ trực tiếp tới POJO?
mitsest

5

Một đồng nghiệp của tôi đã thực hiện một thử nghiệm nhỏ về tình huống này. Anh ta tự động tạo ra một classvà một enumvới cùng một lượng "enums". Tôi tin rằng anh ấy đã tạo ra 30000 mục nhập.

Kết quả là:

  • .classcho classkhoảng 1200KB
  • .classcho enumlà khoảng 800KB

Hy vọng điều này sẽ giúp ai đó.


Tôi không nghĩ đó là bài kiểm tra hợp lệ. Có 30000 enum / trường tĩnh ở một nơi không phải là một kịch bản thực tế. Bạn cần phải so sánh kích thước của một số lượng lớn các lớp / enum nhỏ, ví dụ: 1000 lớp / enums 30 thuộc tính mỗi loại. Tôi cá rằng tổng kích thước sẽ khá khác nhau.
Iwo Banas

7
@Iwo Banas Mọi thử nghiệm đều là thử nghiệm hợp lệ. Không nói rằng nó sẽ trả lời câu hỏi. Chỉ cung cấp nó như là thông tin bổ sung cho bất kỳ ai có thể quan tâm. Và phiếu bầu xuống có vẻ rất xứng đáng, vì vậy cảm ơn bạn. -_-
prolink007 11/09/12

Nó không cho thấy điều ngược lại? Enum đó sử dụng ít hơn? Và nó là bộ nhớ hoặc bộ nhớ là 1200KB hoặc 800KB?
nhà phát triển android
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.