Pertanyaan Mengapa Android tidak menggunakan lebih banyak enum?


Saya mulai sangat suka menggunakan C # dan Java enum dalam kode saya karena beberapa alasan:

  • Mereka jauh lebih aman daripada integer, string, atau set bendera boolean.
  • Mereka mengarah ke kode yang lebih mudah dibaca.
  • Lebih sulit untuk menetapkan enum ke nilai yang tidak valid daripada int atau string.
  • Mereka memudahkan untuk menemukan nilai yang diijinkan untuk variabel atau parameter.
  • Semua yang saya baca menunjukkan bahwa mereka melakukan sama baiknya dengan bilangan bulat dalam C # dan kebanyakan JVM.

Namun, kerangka kerja Android memiliki banyak kasus di mana bendera berbagai jenis perlu diedarkan, tetapi tidak ada yang tampaknya menggunakan enum. Beberapa contoh di mana saya akan berpikir penggunaannya akan bermanfaat Toast.LENGTH_SHORT / Toast.LENGTH_LONG dan View.GONE, View.VISIBLE, dll.

Kenapa ini? Apakah enum berkinerja lebih buruk daripada nilai integer sederhana di Dalvik? Apakah ada beberapa kekurangan lain yang tidak saya sadari?


76
2018-01-27 22:49


asal


Jawaban:


Jawaban ini sudah tidak berlaku lagi sejak Maret 2011. 

Enum dapat digunakan di Froyo dan di atasnya - sesuai dengan jawaban ini (Mengapa "Hindari Enums Di Mana Anda Hanya Perlu Ints" dihapus dari tips kinerja Android?) dari anggota tim Android VM (dan blognya).


Jawaban Sebelumnya:

Rekomendasi tim Android resmi adalah menghindari enum kapan pun Anda dapat menghindarinya:

Enum sangat nyaman, tapi   sayangnya bisa menyakitkan ketika ukuran   dan soal kecepatan. Misalnya, ini:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

menambahkan 740 byte ke   file .dex Anda dibandingkan dengan   kelas setara dengan tiga publik   ints akhir statis. Pada penggunaan pertama,   class initializer memanggil   metode pada objek yang mewakili masing-masing   nilai-nilai yang disebutkan. Setiap objek   mendapat medan statisnya sendiri, dan   set lengkap disimpan dalam array (a   medan statis yang disebut "$ VALUES"). Itu   banyak kode dan data, hanya untuk tiga   bilangan bulat. Selain itu, ini:

Shrubbery shrub = Shrubbery.GROUND;

menyebabkan pencarian medan statis. Jika   "GROUND" adalah int statis akhir,   compiler akan memperlakukannya sebagai yang dikenal   konstan dan sebaris.

Sumber: Hindari Enums Di Mana Anda Hanya Perlu Ints


64
2018-01-27 22:53



Bilangan bulat lebih kecil, dan membutuhkan lebih sedikit overhead, sesuatu yang masih penting pada perangkat seluler.


13
2018-01-27 22:52



Seorang rekan saya melakukan tes kecil mengenai situasi ini. Dia otomatis menghasilkan class dan sebuah enum dengan jumlah "enums" yang sama. Saya percaya dia menghasilkan 30000 entri.

Hasilnya adalah:

  • .class Untuk class kira-kira 1200KB
  • .class Untuk enum kira-kira 800KB

Semoga ini bisa membantu seseorang.


5
2018-05-09 19:37