Sidebar

Classele Enum stârnesc multe controverse în lumea Android din mai multe motive, dar se dovedesc a fi folosite în continuare de către dezvoltatorii experimentați zi de zi. De ce este așa?

(Atenție: în timp ce sintaxa codului de aici va fi în Kotlin, toate informațiile de aici se aplică și pentru clasele enum Java)

Ce este o clasă Enum?

Simplu spus, un Enum este un tip de clasă specială care deține o listă de constante. Cea mai comună utilizare a acestuia este reprezentarea diferitelor tipuri ale unui anumit obiect sau atunci când o variabilă poate fi doar una dintr-un anumit set de valori.

enum class Direction { NORTH, SOUTH, EAST, WEST}

Constantele unui enum nu necesită neapărat o valoare. Fără o valoare, ele pot fi utilizate în validare prin intermediul instrucțiunilor ifs și switch.

val directionToTreasure = Direction.NORTHwhen(directionToTreasure) { Direction.NORTH -> indicateNorth() Direction.SOUTH -> indicateSouth() Direction.EAST -> indicateEast() Direction.WEST -> indicateWest()}

Probabil că nu este cel mai bun mod de a gestiona aceste funcții de indicare, dar ați prins ideea. Cel puțin va fi foarte amuzant

Utilizarea lor poate fi totuși extinsă pentru a include valori atașate fiecărei constante.

enum class Color(val rgb: Int) { RED(0xFF0000) GREEN(0x00FF00) BLUE(0x0000FF)}

Când folosiți clasele enum în acest mod, puteți obține valoarea lor astfel:

val shirtColour = Color.BLUEval color: Int = shirtColour.rgb

Ce mai poate face un Enum?

Pentru a spune pe scurt, al naibii de multe

În primul rând, în loc de constante, enum-urile pot fi implementate clase anonime cu metode proprii și metode de suprascriere a metodelor de bază.

enum class ProtocolState yadayada {}

De asemenea, ele pot implementa interfețe într-un mod similar

enum class IntArithmetics yadayada {}

În cele din urmă, enum-ul are două constante care vă oferă câteva valori destul de utile.

val name: String // The name of the constantval ordinal: Int // The position of the constant in the list of valuesif (shirtColour.name == "BLUE") { // Do some blue stuff}

De fapt, datorită utilizării acestor constante, puteți, de asemenea, să faceți în mod convenabil o corespondență între tipurile enum și String/Int.

Enum -> Int

yourEnum.ordinal

Int -> Enum

EnumType.values()

String -> Enum

EnumType.valueOf(yourString)

Enum -> String

yourEnum.name

Credințe pentru acest tip de pe StackOverflow pentru că a împărtășit această cartografiere

Care este scopul claselor Enum?

Vă înțeleg, nu este cel mai simplu lucru, dar vă voi pune la curent.

În cea mai mare parte, clasele enum sunt folosite pentru a produce cod mai ușor de citit. Atunci când aveți un obiect care poate avea mai multe tipuri diferite, este mult mai concis să le identificați cu o valoare lizibilă decât cu un număr întreg arbitrar.

// Bad codewhen(direction) { 0 -> goNorth() 1 -> goSouth() 2 -> goEast() 3 -> goWest()}// Good codewhen(direction) { Direction.NORTH -> goNorth() Direction.SOUTH -> goSouth() Direction.EAST -> goEast() Direction.WEST -> goWest()}

Un alt scop util al enumelor este atunci când aveți date care vin ca un șir de caractere, dar trebuie să le mapezi în cele din urmă la o valoare int, cum ar fi atunci când API-ul dvs. oferă tipul obiectului dvs., dar trebuie să le treceți într-un adaptor RecyclerView care necesită un Int pentru tipurile View. Eu personal am folosit această metodă în clasa mea enum pentru a face ca acest lucru să se întâmple.

@JvmStaticfun getType(type: String): BlockType? = when(type) { "hero" -> ContentHero "products" -> ContentProductList else -> null }

De ce nu ar trebui să folosiți clasele Enum

Pariu că acum vă gândiți „Stați o secundă. Mi-ai spus totul despre cum să folosesc clasele Enum și acum îmi spui pur și simplu să nu le folosesc?”. Ascultă-mă, amice.

Simplu spus, Enums sunt scumpe, amice! Știu că telefoanele mobile devin din ce în ce mai bune pe zi ce trece, dar, în primul rând, există încă prea mulți oameni cu telefoane mai puțin puternice și, în al doilea rând, modul în care facem aplicații și bibliotecile pe care le folosim folosesc și ele mai multă memorie.

Aceasta este o știre veche. Enums ar fi o problemă de memorie pentru telefoanele care rulează cu Dalvik, dar acesta a fost practic întrerupt în locul ART (Android Runtime Machine). Adăugat la faptul că până și oamenii din țările mai sărace au telefoane destul de puternice și că Proguard poate acum să optimizeze codul mai bine ca niciodată, se poate spune că Enums nu mai reprezintă o problemă de performanță.

Există încă câteva alternative pe care le puteți folosi și care pot obține rezultate similare cu o clasă Enum.

Constantele

Constantele sunt, de asemenea, super concise. Ei rețin o singură valoare și îi dau un nume. Ele sunt, de asemenea, extrem de ușoare.

*Def

Anotarea *Def este, de asemenea, grozavă dacă aveți o variabilă care primește doar anumite valori.

@IntDef({RED, GREEN, BLUE})

De ce să alegeți totuși Enum în locul acestor alternative?

Unul în care Enum strălucește mult mai mult decât frații săi funcționali este exhaustivitatea. Atunci când este utilizat cu Kotlin, puteți utiliza o instrucțiune switch ca aceasta

val foo = when(someEnum) {}

Și atunci când o faceți, sunteți obligat să gestionați un caz pentru fiecare constantă din enum-ul dvs., altfel codul dvs. nu se va compila. Cu constantele și adnotările *def, cel mai bun lucru care vi se dă sunt avertismentele lint. Enumele duc pur și simplu la un cod mai sigur.

(Credits to u/-manabreak from Reddit for this)

Atâta timp cât utilizarea enumelor duce la un cod mai concis pentru aplicația dvs. și, în special în cazul Kotlin, la o mai bună siguranță a cazurilor, prin toate mijloacele, enumerați până la refuz.

Lasă un comentariu