Sirove vrste u Javi

1. Uvod

U ovom ćemo brzom vodiču pogledati sirove vrste, što su i zašto bismo ih trebali izbjegavati.

2. Sirove vrste

Sirova vrsta je naziv za generičko sučelje ili klasa bez argumenta tipa:

Lista popisa = novi ArrayList (); // sirovi tip

Umjesto:

Popis listIntgrs = novi ArrayList (); // parametarski tip

Popis je parametarski tip sučelja Popis dok Popis je sirovi tip sučelja Popis.

Neobrađene vrste mogu biti korisne prilikom povezivanja s generičkim naslijeđenim kodom.

Inače, obeshrabreno je. Ovo je zbog:

  1. Nisu izražajni
  2. Nedostaje im sigurnost tipa, i
  3. Problemi se uočavaju u vrijeme izvođenja, a ne u vrijeme kompajliranja

3. Neekspresivno

Neobrađeni tip ne dokumentira i objašnjava se onako kako to radi parametarski tip.

Lako možemo zaključiti da je parametarski tip Popis je popis koji sadrži Nizs. Međutim, sirovom tipu nedostaje ta jasnoća, što otežava rad s njim i njegovim API metodama.

Pogledajmo potpis metode dobiti (indeks int) u Popis sučelje da ovo bolje razumijemo:

/ ** * Vraća element na navedenom položaju na ovom popisu. * * @param indeks indeksa elementa za vraćanje * @return element na navedenom položaju na ovom popisu * @throws IndexOutOfBoundsException ako je indeks izvan opsega * (index = size ()) * / E get (int index) ;

Metoda dobiti (indeks int) vraća a Niz na položaju indeks u parametriziranom tipu Popis.

Međutim, za sirovi tip Popis, vraća an Objekt. Stoga smo dužni uložiti dodatne napore kako bismo pregledali i identificirali vrstu elementa u sirovoj vrsti Popis i dodajte odgovarajuće lijevanje tipa. To može uvesti bugove u vrijeme izvođenja kao što je sirovi tip nije tip siguran.

4. Nije sigurno za tip

Primjenjujemo generičko ponašanje sa sirovim vrstama. Stoga, sirovi tip Popis prihvaća Objekt i može sadržavati element bilo koje vrste podataka. To može dovesti do problema sa sigurnošću tipova kada kombiniramo parametrizirane i sirove vrste.

Pogledajmo to stvaranjem nekog koda koji pokreće a Popis prije nego što ga proslijedi metodi koja prihvaća sirovi tip Popis i dodaje an Cijeli broj tome:

javna void metodaA () {Popis parameterizedList = novi ArrayList (); parameterizedList.add ("Zdravo narode"); metodaB (parametrizirani popis); } javna void metodaB (popis rawList) {// sirovi tip! rawList.add (1); }

Kôd se kompajlira (s upozorenjem) i Cijeli broj dodaje se sirovoj vrsti Popis kad se izvrši. The Popis to je prošlo kao argument sada sadrži a Niz i an Cijeli broj.

Prevodnik ispisuje upozorenje zbog upotrebe sirovih vrsta:

Napomena: RawTypeDemo.java koristi neprovjerene ili nesigurne operacije. Napomena: Ponovno kompilirajte s -Xlint: nije označeno za detalje.

5. Problemi tijekom izvođenja

Nedostatak sigurnosti tipa na sirovom tipu ima uzročni učinak koji može dovesti do izuzetaka tijekom izvođenja.

Izmijenimo prethodni primjer tako da metodaA dobiva element na indeksnoj poziciji 1 našeg Popis nakon poziva metodaB:

javna void metodaA () {Popis parameterizedList = novi ArrayList (); parameterizedList.add ("Zdravo narode"); metodaB (parametrizirani popis); Niz s = parameterizedList.get (1); } javna void metodaB (popis rawList) {rawList.add (1); }

Kôd se kompajlira (s istim upozorenjem) i baca a ClassCastException kad se izvrši. To se događa kao metoda dobiti (indeks int) vraća an Cijeli broj, koji se ne može dodijeliti varijabli tipa Niz:

Iznimka u niti "main" java.lang.ClassCastException: java.lang.Integer se ne može prebaciti na java.lang.String

6. Zaključak

S sirovim vrstama je teško raditi i mogu unijeti greške u naš kod.

Njihova upotreba može dovesti do posljedica koje mogu biti katastrofalne, a nažalost, većina tih katastrofa događa se u vrijeme izvođenja.

Pogledajte sve isječke u ovom vodiču na GitHubu.