Portál AbcLinuxu, 8. května 2025 19:11

Platforma Java a hodnoty výčtů v kolekcích

30.12.2010 18:07 | Přečteno: 1035× | poslední úprava: 31.12.2010 11:35

Jak vhodně pracovat s hodnotami výčtů v některých typech kolekcí? Tento text nabízí jedno z možných řešení.

Výčtové typy (anglicky enumerated types, enumerations, enums) používám k velmi rozsáhlé škále činností, nejčastěji k indikaci stavu, typu apod. Dříve, než byly výčtové typy v jazyku Java uvedeny, se používaly především (celo)číselné konstanty, čehož je dokladem např. třída javax.swing.SwingConstants.

Používání čísel má několik nevýhod. Zaprvé není dáno, že je nutné používat konstanty, takže kdokoli může předávat literály a kompilátor ani nemukne — a pokud někdo změní hodoty konstant, mohou si vývojáři drbat hlavy, kde se stala chyba… Zadruhé je problematická kontrola validity čísla, protože musí (nebo by měla) být řešena při každém předání (aby někdo nepředal např. vyšší číslo atd.).

Toto všechno výčtové typy řeší. A řeší toho mnohem víc. A proto je tak rád používám. Někdy je také potřebuji umístit do kolekce; nejčastěji je používám jako klíče v mapách.

Mnoho lidí k tomu používá objekty tříd jako HashMap nebo LinkedHashSet, což je velká škoda, neboť existují i kolekce navržené přímo pro výčtové typy. Moc se o nich neví, a já jsem přesvědčen, že to souvisí s faktem, že v tutoriálu jsou zmíněny spíše méně než více.

Abych byl konkrétní, jedná se o množinu (implementuje Set) EnumSet a mapu (implementuje Map) EnumMap. Obě kolekce by údajně měly být velmi výkonné (rychlé), dokonce prý „téměř jako pole“. Hlavní ale jsou speciální vlastnosti a funkce zaměřené na výčtové typy.

Množiny

Třída EnumSet representuje množinu hodnot výčtového typu (to znamená, že její velikost může být nula až počet hodnot výčtového typu). Dokumentace slibuje velmi pravděpodobný (avšak ne zaručený) vyšší výkon, než poskytuje HashSet. Základní operace by navíc měly pracovat v konstantním čase.

Třída EnumSet je abstraktní; její instance se vytvářejí pomocí několika továrních metod (neexistují podtřídy). Navíc má třída parametr E extends Enum<E>, který typově omezuje prvky množiny.

Potřebujete-li, aby byla množina inicializována všemi hodnotami výčtu, použijte metodu allOf (jako argument je nejsnažší předat literál třídy):

static <E extends Enum<E>> EnumSet<E> allOf(Class<E> type)

Můžete vytvořit také prázdnou množinu:

static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> type)

Možná budete chtít inicializovat určitým rozsahem hodnot. Hodnoty výčtu jsou v takovém pořadí, v jakém byly definovány (což mě obvykle diskvalifikuje, protože já je tvrdohlavě řadím v abecedním pořádku, nikdy ne dle významu). Jedná se o metodu range (přidají se i krajní hodnoty):

static <E extends Enum<E>> EnumSet<E> range(E firstElement, E lastElement)

Lze také provést inicializaci určitými hodnotami:

Nakonec můžeme inicializovat jinými kolekcemi:

Do kolekce EnumSet nelze přidat hodnotu null. Pokud se o to pokusíte, budete odměněni příslušnou výjimkou.

Mapy

Třída EnumMap představuje mapu, v níž jsou klíčem hodnoty výčtu (null nelze použít). Dokumentace opět slibuje vyšší (ale opět nezaručený) výkon než EnumMap.

Třída EnumMap má dva parametry: K extends Enum<K>, který representuje typ klíčů mapy, a V representující typ hodnot.

Objekty lze vytvářet pomocí veřejných konstruktorů:

EnumMap nenabízí žádné zvláštní metody.

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

30.12.2010 18:43 kolcon | skóre: 15 | blog: kolcon
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Odpovědět | Sbalit | Link | Blokovat | Admin
zlaty perl a jeho hashe nez tohle... ani citelny to neni...
30.12.2010 18:47 JS
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Odpovědět | Sbalit | Link | Blokovat | Admin
Ehm, bitove pole? Zase se ukazuje pravdivost toho citatu s Common Lispem, ze k nemu (preslozite) konverguji vsechny jazyky.
vulgární Nick avatar 30.12.2010 18:55 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Odpovědět | Sbalit | Link | Blokovat | Admin
Tohle jsem čekal. Není snad článek o programování, kde by lůza nepropagovala své oblíbené hračky. Běžte si někam na gay stránky, tam jsou pro buzeranty zařízení...
JSEM PRASE A HOVADO.
vulgární Nick avatar 30.12.2010 18:56 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
(Lůzou samozřejmě míním ty dva ocasy, co komentovali přede mnou.)
JSEM PRASE A HOVADO.
________________ avatar 31.12.2010 02:22 ________________ | skóre: 5 | blog: _
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
To neni lúza, je to len neškodné náboženstvo, ich boh je LISP, ich odpoveď na všetko je LISP, všetky moderné technológie (Java, .NET, XML) podľa nich raz nahradí LISP (to tvrdia už 50 rokov), LISP je ich mantra dokážu ju zopakovať v jednom príspevku aj 50x. Je to len neškodná sekta, pár bláznivých programátorov, ktorí sa predávkovali kofeinom, prípadne nadmerným množstvom marihuany.
31.12.2010 08:24 JS
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Zajimalo by me, co o Lispu vite. Ono ze je neco moderni bohuzel jeste neznamena, ze je to dobre (a to neplati v IT zdaleka jen o programovani). Dokazu pochopit, proc nekdo muze obhajovat Javu nebo .NET pred Lispem (standardni knihovny, typova kontrola). Ale hajit XML pred s-expressions? Vazne? (Muzete zacit lecit vasi neznalost treba tady.)

P.S. Odsoudit cizi nazor jako nabozenstvi je dost lacine.
vulgární Nick avatar 31.12.2010 11:23 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Jedna věc je, co o Lispu víme.

Druhá věc je, jestli se o něm něco chceme dozvídat pod blogposty o Javě.
JSEM PRASE A HOVADO.
vulgární Nick avatar 31.12.2010 11:25 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Ona to není moc dobrá sekta... Vždyť se jim nedaří nábor; mantru omílá pořád těch několik stejných lidí. :)))
JSEM PRASE A HOVADO.
31.12.2010 12:59 kolcon | skóre: 15 | blog: kolcon
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
pekne dekuju, z pouzivani takovych "modernich" veci jako .net nebo java jsem vyrostl - pouzivani proprietarnich technologii microsoftu nebo oraclu vidim jako prilis velke riziko pro projekty do budoucna

a xml je kapitola sama pro sebe - jako pro nektery veci dobry (ukladani databazi do txt souboru, vymena nekterych strukturovanych dat) ale jinak overhype vec
30.12.2010 19:39 kolcon | skóre: 15 | blog: kolcon
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích

Pozor - vynos ministra informaci - od teto chvile se zakazuje psat

do komentaru blogu, tykajicich se programovacich jazyku,

jakekoliv dojmy nebo srovnani s jinymi jazyky.

 

Vyjimku maji pouze komentare, podlozene vlastni disertacni praci,

pripadne ty, schvalene vrchim censorem se sprostym nickem

30.12.2010 20:06 JS
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Shodou okolnosti, pointa meho prispevku byla, ze jsem skutecne chtel vedet, zda je to interne implementovane jako bitove pole.

A chtel jsem to vedet prave proto, ze ve svem vlastnim (zatim ne zcela vysnenem) jazyce jsem se bitovych poli (s aplikaci konecnych podmnozin omezeneho mnozstvi prvku) nedokazal zbavit i pres tvrdou snahu maximalne sjednotit slozene typy (a hadam, ze ze stejneho duvodu se toho nedokazal zbavit ani Common Lisp).

Coz ovsem zmineny troll nemohl pri sve inteligenci zaznamenat.
vulgární Nick avatar 30.12.2010 20:16 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
1. Váš dotaz byl jen částí příspěvku. Větší část příspěvku se týkala propagace CL. Jestli se neumíte na něco zeptat, aniž byste dělal reklamu na své oblíbené výrobky, raději se ani neptejte.

2. Vy jste tím, že CL zmiňujete skoro všude, kde se vyskytnete, známý, takže troll jste vy.
JSEM PRASE A HOVADO.
30.12.2010 20:40 JS
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
No a, porad lepsi nez vy, mate uz 4 prispevky a zadny z nich k veci.
vulgární Nick avatar 30.12.2010 20:47 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Všechny moje příspěvky byly reakcí na jiné komentáře. Kdyby otrapové jako vy nepsali pitomosti, já bych na to ani nemohl nereagovat.
JSEM PRASE A HOVADO.
30.12.2010 21:37 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Jo, EnumSet je bitové pole.
Ještě na tom nejsem tak špatně, abych četl Viewegha.
30.12.2010 21:39 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
(Resp. jeden long nebo pole longů a pár bitových operací.)
Ještě na tom nejsem tak špatně, abych četl Viewegha.
vulgární Nick avatar 30.12.2010 22:09 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
To mu ani nemusíte říkat. Rád odkazujete na dokumentaci, odkažte jej tedy na dokumentaci, kde se to jasně píše. Nebo uznáváte, že i mimo dokumentaci mohou existovat hodnotné informace, byť duplikují dokumentaci? Jak to tedy je?
JSEM PRASE A HOVADO.
30.12.2010 22:15 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
O předčasné ejakulaci už jste slyšel, že? Tak si najděte ještě předčasnou generalizaci. Jo, a když už v tom budete, najděte si taky smysl pro humor. Snažíte se jako ťapina, ale výsledky chybí.
Ještě na tom nejsem tak špatně, abych četl Viewegha.
vulgární Nick avatar 30.12.2010 22:18 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
O předčasné ejakulaci jsem slyšel, ale nikdy jsem nepotkal člověka, u koho bych ji předpokládal - tedy až dosud. Jak se cítíte?
JSEM PRASE A HOVADO.
30.12.2010 19:13 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Odpovědět | Sbalit | Link | Blokovat | Admin
Obsah článku shrnutý do jedné věty: Pro výčtové typy existují v javovské standardní knihovně specializované implementace množiny (EnumSet) a mapy (EnuMap), podívejte se do dokumentace. Where's the point?
Ještě na tom nejsem tak špatně, abych četl Viewegha.
vulgární Nick avatar 30.12.2010 19:21 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
To lze říct o každém textu, který neobsahuje něco zcela nového, nikdy nikde neviděného.

Přečetl jsem si váš článek o CouchDB. Můžete mi prosím říct, které pasáže popisují něco, co ještě nikdy nebylo popsáno?
JSEM PRASE A HOVADO.
30.12.2010 21:38 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
V češtině? Téměř všechny.
Ještě na tom nejsem tak špatně, abych četl Viewegha.
vulgární Nick avatar 30.12.2010 22:06 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Najednou to omezujete na češtinu... No dobrá, kolik informací je v češtině o použití enumů v kolekcích? Neříkám, že nejsou, ale člověk na ně obvykle přijde jen tehdy, když je hledá (pokud nepočítám jednu knihu o novinkách Javy 5, kde na ně lze přijít i tehdy, když to člověk nehledá).
JSEM PRASE A HOVADO.
31.12.2010 00:32 YYY | skóre: 29 | blog: martinek
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Jiste. Tento blogpost je pro profi javistu jako jste vy celkem nezajimavy. Od toho je to blogpost. Na druhou stranu clanek o CouchDB byl prinosem pro zacatecniky v dane problematice. Zkuste zhodnotit, co ma pro abc vetsi prinos... Myslim, ze vy byste mel odtahnout na profi java stranky (asi gay dot com podle vas) a mel byste zde prestat otravovat tu amaterskou luzu.
vulgární Nick avatar 31.12.2010 00:43 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Tento blogpost je pro profi javistu jako jste vy celkem nezajimavy.
To je lež, mně se ten blogpost líbí a považuji ho za zajímavý.
Na druhou stranu clanek o CouchDB byl prinosem pro zacatecniky v dane problematice.
Nevím, školy nemám, ale tento blogpost je sám o sobě (pro Java programmera) poměrně triviální, nicméně ukazuje něco, co je poměrně málo známé. A článek o CouchDB se mi líbí. Nicméně ho považuju za stejně odborný (i když je samozřejmě rozsáhlejší) jako tento blogpost.

Podle mě jste blázen, nebo reagujete na špatný komentář / špatnou osobu.
JSEM PRASE A HOVADO.
31.12.2010 00:54 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Srsly, tenhle blogpost je dobře napsaný, o tom žádná, ale fakt o EnumSetu a EnumMapě tolik lidí neví? To nežeru. Podobně napsaný článek např. o CyclicBarrier nebo CountDownLatch (to je to první, na co jsem si vzpomněl: spousta lidí nezná z java.util.concurrent nic než Atomic* a Concurrent*, a jsou i tací, co neznají ani to) bych považoval za mnohem zajímavější.
Ještě na tom nejsem tak špatně, abych četl Viewegha.
vulgární Nick avatar 31.12.2010 01:05 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Tak samozřejmě si nedělám čárky, kdo co zná... Jen jsem se i já setkal s neznalostí daného tématu. Ono záleží na tom, co kdo programuje. Kdo dělá jen server side, ten asi nebude moc znát ani nejelementárnější prvky Swingu a naopak (OK, enumy nejsou nic specializovaného, to byl jen příklad).

Neříkám, že si neumím představit zajímavější články (a ano, java.util.concurrent by mě určitě zajímalo víc). Tady šlo o to, že jste blogpost shazoval jen proto, že se vám asi zdál málo rozsáhlý / málo objevný (možná něco jiného, nevím).
JSEM PRASE A HOVADO.
31.12.2010 09:11 podlesh | skóre: 38 | Freiburg im Breisgau
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Srsly, tenhle blogpost je dobře napsaný, o tom žádná, ale fakt o EnumSetu a EnumMapě tolik lidí neví?
To by ses divil, kolik lidí netuší že existuje něco jiného než ArrayList a HashMap :-( Nebo tuší, ale zhruba na stejné úrovni jako že existuje Zanzibar.
31.12.2010 14:05 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Ani nechci vědět, co takoví lidi používají pro frontu (nejlíp obousměrnou)…

No nic. Zdá se, že je potřeba lidi vzdělávat i v takhle triviálních věcech. Ach jo.
Ještě na tom nejsem tak špatně, abych četl Viewegha.
vulgární Nick avatar 31.12.2010 17:11 vulgární Nick | blog: Takže já jsem jedinej, kdo čůrá do vany?
Rozbalit Rozbalit vše Re: Platforma Java a hodnoty výčtů v kolekcích
Na šíření triviálních informací není nic špatného. Někdo trivialitu nezná ani jako "odborník", ale jsou i lidé, co odborníky (ani "odborníky") zatím nejsou.
JSEM PRASE A HOVADO.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.