Testy z Javy – oblíbený příklad

Nemám rád takové ty testové otázky, které se skládají z výpisu kódu přibližně o dvaceti řádcích následovaného otázkou, co program po spuštění vypíše na konzoli, s možnostmi odpovědí, z nichž ty první v pořadí jsou kompilační chyba, chyba za běhu a nic se nestane. O respondentovi se dozvíte nejspíše jenom to, jak si dokáže všímat detailů. Což se může hodit, ale není to všechno. Navíc například mě osobně takové testy urážejí, protože si s nimi někdo nedal žádnou práci, prostě je opsal z příkladů k certifikaci, a opravování si chce také maximálně ulehčit.

Já mám raději příklady, ze kterých jsem schopen odhadnout, kolik toho má ten člověk za sebou. Jeden z mých oblíbených spočívá v tom, že chci implementovat následující metodu:


/**

* Removes from collection all items that contain given text.

* Supposes  parameters are not null and  the collection doesn't contain null.

*/

public void filter(Collection<String> collection, String text) {

// TODO: implement

}

Když se ti, kteří neumějí procházet kolekce, odebéřou zjišťovat, jak udělají z kolekce pole, které si pak proběhnou přes indexy, dostaneme první skupinu, která napíše toto:


for (String item : collection) {

  if (item.contains(text)) {

    collection.remove(item);

  }

}

Což skončí výjimkou ConcurrentModificationException. Autor kódu tedy něco o Javě ví, ale moc toho nenaprogramoval. Zkušenější, ale stále ještě junior, si zkusí poradit nějak takto:


Collection<String> toBeRemoved = new ArrayList<>();

for (String item : collection) {

  if (item.contains(text)) {

    toBeRemoved .add(item);

  }

}

collection.removeAll(toBeRemoved);

Což už výjimky generovat nebude. Autor má něco za sebou, ale spokojí se s prvním řešením, které ho napadlo nebo ho někde opsal. Kód, který chci vidět, vypadá takto:


for (Iterator<String> iterator = collection.iterator(); iterator.hasNext();) {

  String item = iterator.next();

  if (item.contains(text)) {

    iterator.remove();

  }

}

A je to. Iterátor umí použít kdekdo. Ale dost lidí zná dvě metody toho rozhraní. Tu třetí ignoruje.

Edit: Obdržel jsem rozumnou připomínku, že mé nejlepší řešení nemusí fungovat pro všechny typy kolekcí, ano, z metody může vyletět UnsupportedOperationException. Ale myslím si, že se dá považovat za zodpovědnost volajícího, že chce modifikovat kolekci, která modifikaci umožní.

ODS s Klausem? Tak to se mnou nepočítejte

ODS pro mě byla celá devadesátá léta i na začátku tisíciletí nevolitelná z několika důvodů. Vedle protievropské, velkoropácké a papalášské politiky byl tím nejzásadnějším důvodem Václav Klaus. S jeho odchodem z vedení ODS se pro mne tato strana přesunula z přihrádky NIKDY do přihrádky MOŽNÁ. Od té doby jsem ji volil do městského zastupitelstva jednou v Hradci Králové a jednou v Mladé Boleslavi, kde jsem navíc v posledních senátních volbách v obou kolech volil jejího kandidáta. Neúspěšně, ale za to já už nemůžu.

V ODS se i po Klausově prásknutí dveřmi na viditelných pozicích vyskytovaly a dodnes vyskytují persony, s jejichž názory jsem v zásadním konfliktu, jako například Jan Zahradil, persony, jimiž pohrdám, jako byl například Mirek Topolánek, Pavel Bém nebo David Vodrážka, mám-li jít ještě více do minulosti, vzpomenu v této souvislosti například na první vlny senátorů za ODS, jmenovitě pány Jana Koukala či Milana Kondra. Spousta z nich zmizela ve zkaženém žaludku dějin a s nimi mnohé manýry, jejichž byli ti pánové vrcholovými reprezentanty. Dodnes mi hodně vadí vliv paralelních struktur na praktickou politiku té strany. Programově však, až na tu Evropskou Unii, nenacházím zásadnější záminku pro rozhodný nesouhlas. Možná tedy přijde chvíle, kdy začnu ODS volit opakovaně.

Poslední dobou však z ODS zaznívají hlasy volající zpět Václava Klause, tentokrát v roli spasitele. Chápu, že má ODS, stejně jako celý český národ, jistý konkrétní personální problém, jímž je nedostatek autorit, myšleno v kladném slova smyslu. Avšak v případě, že budou tyto bezradné a ufňukané hlasy budou, stane se pro mě ODS opět nevolitelnou. A protože jsem se opakovaně přesvědčil, že mé názory a postoje nejsou tak originální, jak jsem si myslel, doufám, že si ODS uvědomuje, že Václav Klaus představuje nepřekonatelný problém pro nezanedbatelnou část jejích potenciálních voličů.

Michal Hašek na funkcích lpící

Michal Hašek je nade vší pochybnost člověk pronikavé inteligence, jasných vizí, vysokých morálních kvalit, pevných zásad, nezměrných životních zkušeností z různých oborů lidské činnosti, přímého charakteru… No dobře, tak asi není. Přesto ho voliči vybrali jako svého zástupce v dolní sněmovně parlamentu. Dokonce ho preferenčními hlasy posunuli z nevolitelného místa, kde se ocitl na vlastní žádost, aby sice svou vzácnou přítomností okrášlil volební lístek své strany, ale do parlamentu se nedostal. Býti poslancem se totiž neslučuje s hejtmanováním, jemuž se v tu dobu na plné kotle věnoval. To, že se neslučuje, ho ještě předtím vedlo ke složení poslaneckého mandátu poté, co se hejtmanem stal. Ostatně tento krok sám Michal Hašek uvádí jako skutek hodný vysokého ocenění.

Takže tenhle Michal Hašek byl proti své vůli donucen svými milovanými a milujícími voliči ocitnout se opět jak ve funkci hejtmana tak ve funkci poslance. Tentokrát ale asi přišel na to, jak to všechno zvládnout najednou, takže už nemusel na nic rezignovat.

Časem začali někteří šťouralové poukazovat na to, že Michal Hašek v té poslanecké sněmovně víc není, než je. Ukazovali všelijaké statistiky, kolika hlasování se učastnilo kolik poslanců a kteří chyběli. No a z těch, co nebyli zavření, skoro nejčastěji chyběl právě Michal Hašek. Takže to asi s tím zvládnutím těch několika funkcí zas asi není taková legrace. Ony totiž, jen tak na okraj, nejsou ty funkce dvě, on jich má Michal Hašek spoustu. No a obviněn z toho, že své poslancování Michal Hašek tak trochu fláká, použil obhajobu, která rozhodně přepokládá alespoň polovinu charakteristik, jež jsem uvedl na začátku své stati. Nikdo totiž nemůže chtít po poslanci Michalu Haškovi, aby se věnoval funkci poslance, jestliže tento, jak sám prohlašuje, odevzdává svůj poslanecký příjem na dobročinné účely. Paráda.

Takže se zvedneme od svých obrazovek a přesuneme se na nějakou blízkou stavbu, k libovolné vznikající jámě. A představíme si, jak některý z těch opálených svalovců s lopatou či krumpáčem v ruce ustojí debatu o tom, že za poslední měsíc přišel do práce sotva pětkrát, argumentuje, že on dává svůj plat na dobročinné účely. Asi blbost.

Vzpomínám si na sklonek bolševické éry. Jedním z termínů, kterým se častoval tehdejší režim  pro jeho absurditu a amorálnost, bylo sousloví kumulace funkcí. Mělo se to tehdá za něco eklhaft, když ti legrační uslintaní senilní strejdové oplývali hromadou fukcí, jako dnes oplývá Michal Hašek.

@MZemanOficialni

Miloš Zeman používá Twitter. Jeho profil se nazývá MZemanOficialni. Pochybuji, že člověk, jehož primárním zdrojem informaci je teletext, ví, co jsou to sociální sítě, ale to není ten důvod, proč mi jeho twitterování přijde vtipné. Při pohledu na název jeho účtu totiž nemohu nevzpomenou na postavu z knihy Noční hlídka Terryho Pratchetta, která se jmenuje První Legitimní. Jak je tomu v mnoha případech zeměplošského autora, i k tomuto neobvyklému jménu se váže zajímavý příběh. Literární matka pana Prvního Legitimního pojmenovala totiž svého synka plna nadšení, že se po několika pokusech konečně jedná o dítě manželské, a jeho jméno tedy navždy připomíná tuto radostnou událost.

O relevantních návratových hodnotách

Jednou ze šikovných byť trochu nefér pastí programátorských testů je dotaz, co vypíše do konzole následující kód:

String text = "Ahoj, Honzo!";
text.replaceAll("Ahoj", "Styď se");
System.out.println(text);

Podraz je v tom, že metoda replaceAll nemodifikuje objekt, na němž je zavolána, ale namísto toho vrací nový řetězec. V případě třídy java.lang.String se tak chovají všechny metody, protože tato třída je immutable. Takže spousta respondentů odpoví, že na konzoli se vypíše řetězec „Styď se, Honzo!“ Což je sice odvážné, ale je to špatně.

Přibližně před rokem a půl jsem itenzivně řešil problém s komponentou, která měla nějakým způsobem filtrovat url požadavku, a nechtěla se to naučit. Chyba nakonec byla právě v zahození návatové hodnoty metody třídy String.

Ten problém by šel zobecnit. Máme metodu, jejíž volání je irelevantní, jestliže nepřiřadíme její výsledek. Metoda nic nemodifikuje a nemá ani žádné vedlejší účinky. Napadlo mne, že by se nebezpečí dalo odvrátit, kdyby byla k dispozici anotace, která by překladač informovala o tom, že návratová hodnota nesmí být ignorována. Překladač by pak druhý řádek mého příkladu považoval za chybu a odmítl třídu přeložit.

@MustAssign
public <T> T createCopy(T original) {
...

Možná by někoho napadlo automaticky tuto anotaci používat například u getterů, ale nemyslím si, že zrovna to by byl šťastný nápad. Vezměme si například toto:

Person person = entityManager.find(Person.class, id);
person.getChildren();
return person;

Volání metody getChildren() může vypadat jako chyba a metoda sama se může stát kandidátem pro naši novou skvělou anotaci. Ale spíš to vypadá jako zajištění inicializace fetch-type lazy atributu před odpojením entity.

Neuvážené plýtvání anotací by mohlo přinést i komplikace, ale jsem toho názoru, že bychom našli spoustu příkladů, kde by přínosy převážily. Jak jsem naznačil, mohlo by tomu tak být v případě metod immutable třít nebo v případě utility metod, které nemodifikují parametry.
Takže jestli znáte u oráklů někoho, kdo tam dělá víc než kafe, zkuste mu, prosím, navrhout, ať to prosadí do devítky Javy.

Popelníček, Drtinová

Po učebnicové ukázce vrcholového rektálního alpinismu ředitele České televize po žádosti, těžko se mi to píše, prezidenta Miloše Zemana o popelníček v budově televize, kde je kouření zakázáno, je velmi nepravděpodobné, že by tentýž ředitel uměl odolat požadavku odvolání moderátorky Daniely Drtinové z pořadu Události, komentáře.

Tak ústava už je asi také idiotská

Vratislav Mynář: „Je škoda, že vláda pana Rusnoka žádá o důvěru v Poslanecké sněmovně, a ne třeba cestou občanského referenda. Kdyby to bylo na lidech, bylo by to velmi markantní vítězství pro Rusnokovu vládu. Máme tady ale parlamentní demokracii.“
Citát je uveden v článku Další úřednická vláda? Podle Mynáře reálná alternativa  na webu ČT24.

Takže takhle to je. Nejdříve zatočíme se zvyklostmi a pak i s Ústavou samotnou. Také bych uměl říct, co je škoda. Je škoda, že máme přímou volbu prezidenta, je škoda, že je Miloš Zeman prezidentem. Je ale dobře, že ani Miloš Zeman ani Vratislav Mynář nemohou měnit Ústavu. Zaplaťbůh to není možné ani cestou občanského referenda.

Java jokes

Uvědomil jsem si před časem, že na rozdíl od optiky (Cyrano s brýlemi) či chemie (H2SO5) nemá Java žádné odborné anekdoty. Rozhodl jsem se s tímto nedostatkem vypořádat s nasazením sobě vlastním a ve zbytku života nějaké složit. Předkládám tedy národu první vlaštovky.

Anekdota první:

if (this == null);
 

Anekdota druhá:


this++;

Anekdota třetí:


public void getName();

Zatím jich víc nemám, ale ještě jsem neskončil.

No, alespoň připojím jeden, který je sice obecnější, ale také se mi poved:

Nepříjemné je, když vám na záchodě po akci zůstane v ruce splachovadlo a vy si uvědomíte, že jste v transakci.

Appendix 1: Návrhový vzor Drbna

Jednu dobu jsem se zabýval nalézáním nových návrhových vzorů. Nejlépe rozpracovaný jsem měl vzor, který jsem po určitou dobou nazýval vzorem Tchýně, ale později mne napadl o něco vhodnější název Drbna. Tímto se omlouvám těm ze svých dosavadních sousedek a kamarádek, jichž se dále uvedené schéma netýká. Pojďme tedy k definici. Návrhovému vzoru Drbna odpovídá vnitřní třída, která publikuje veškeré soukromé členy své vnější třídy. Je samozřejmě nutné, aby vnitřní třída měla jiný modifikátor přístupu než private.

package cz.lender.java.jokes;

public class Victim {	
	private int braSize;	
	// give me more secrets
	public class Gossip {
		public int getVictimsBraSize() {
			return braSize;
		}
		// do not omit anything!
	}
}
package cz.lender.java.jokes;

import cz.lender.java.jokes.Victim.Gossip;

public class Nosy {	
	public void getInformationAboutVictim(Victim victim) {
		Gossip gossip = victim.new Gossip();
		int victimsBraSize = gossip.getVictimsBraSize();
		System.out.println(victimsBraSize > 5 ? "busty" : "flat");
	}
}

Appendix 2: Fronta typu Kečup

Fronta typu Kečup se chová divně. Ti, kdo se setkali s kečupem v jeho přírozeném prostředí, tedy ve skleněné láhvi, to budou znát.

Prvních n volání metody poll fronty typu Kečup totiž většinou vrátí null. Další volání pak vrátí celý obsah fronty. Z toho nutně plyne, že frontu typu Kečup není možné implementovat genericky, a použití fronty tohoto typu postrádá od Javy 5 smyslu. Ostatně kečup se dnes také vyskytuje většinou v plastových obalech.

Železářství

Celé dětsví, mládí a ranou dospělost disponoval jsem poměrně bohatou zásobou rozličného spojovacího materiálu, pečlivě roztříděného podlě těžko identifikovatelného klíče do několika objemných sklenic. No dobrá, měl jsem v tom binec, ale většinou jsem našel, co jsem potřeboval. Před několika lety jsem se stal vlastní vinou obětí několika navzájem souvisejících a do sebe zapadajících změn, jež mimo jiné vyústily i v to, že jsem o uvedenou zásobu přišel. A stalo se to, čemu bych těžko někdy věřil, celkem dlouho se dalo přežít bez ní.

Přesněji řečeno do minulého týdne, kdy jsme během víkendové cyklistiky ztratili poblíž Kuksu šroubek od blatníku. Jsa dobrým Čechem poradil jsem si na místě za pomoci několika gumiček. Po cestě domů uvědomil jsem si tu strašnou pravdu, že nemám zbloudilou součástku čím nahradit.

Na dnešek jsem naplánoval návštěvu železářství v Hořické ulici. Mým plánem bylo obnovit alespoň základní sestavu šroubků a matiček pro vykrytí chvil aktuální nouze, jako byla ta před chvílí naznačená, takže pár kousků o dvou velikostech, k tomu podložky a matky. Zavrhl jsem hobby markety, které právě v tomto sortimentu mají snahu sedřít kutily z kůže. Ne, že bych ty prachy neměl, ale prostě jim je nehodlám dát.

Teď bych rád vysvětlil, proč s tím dělám takový tyátr. Odjakživa vím, že přistoupit k pultu v železářství vyžaduje odvahu. Nebýt připraven znamená být potupen, ztrapněn a znemožněn. Jednu dobu jsem přípravu na ten výkon prováděl právě v hobby marketech, kde jsem piloval terminologii a výslovnost, učil se zpaměti velikosti v trubek v coulech nebo typy hlaviček vrutů. Přesto jsem poté v boji o čest málokdy zabodoval.
„Potřeboval bych redukci půl coulu na pět čtvrtin coulu.“
„Ano?“
„S vnějším závitem…“
„Takže ne redukci. Vsuvku.“
Sakra.

Prostě to není jednoduché, přesvědčit toho chlapa, že nejsem naprostej mamlas. To všechno jsem si uvědomoval, když jsem se blížil k pultu v hromadách blejskavých kovů a závitů, za nímž číhal ten dravej examinátor.
„Co to bude?“ No, to není tak zlý.
„Nějaký šrouby bych si vzal.“
„Šrouby nebo vruty?“ Hezkej pokus.
„Šrouby.“
„Velikost?“ nenechal se zlý železář vyhodit z tempa.
„Čtyřky a šestky.“
„Hlavička?“ přitvrdil.
„Šestihran.“
„NE!“ Tak. A jsem v loji.
„Jako že neexistuje?“ opatrně zkouším led pod nohama.
„Jako že nemám.“ Uf. Ale už jsem v defenzívě. Je to holt fachman.
„Nojo. Tak…“
„Půlkulatou, křížovou?“ Když se myš nehejbe, kočka povolí.
„Třeba.“
„Kolik?“ Pak už to pokračuje v rychlém sledu. Nenechá mě vychladnout. Dál? Velikost? Kolik? Dál?

Netrvalo to ani pět minut, tep mám pouze v anaerobní zóně, takže asi přežiju, a stojím s umně smotaným papírovým kornoutem popsaným číslicemi. Sedmnáct korun.

Kindle DX

Po delším váhání, jestli něco takového potřebuju, jsem si pořídil čtečku. Mám běžně ke čtení několik pdf dokumentů, takže jsem se po konzultaci se zkušenějšími kolegy rozhodl pro větší kus, konkrétně pro Kindle DX, jehož prodej nedávno Amazon obnovil, a který má úhlopříčku 9,7 palce.

Čtečka kupodivu z Whitestownu v Indianě do Hradce Králové dorazila za dva dny, takže jsem ji mohl přibalit na dovolenou. Měl jsem malý problém s 3G připojením, musel jsem mu trochu pomoct, ale nakonec jsem vyhrál. Přes USB jsem do přístroje nahrnul svou sbírku pdf knih a na Amazonu nakoupil dva tituly k Oracle SOA Suitě, čistě z cvičných důvodů. Nadchlo mě a zároveň vyděsilo, jak snadno to lze provést.

Teď ta slabší část. Funkčnost Mail to Kindle mi přijde docela nahlouple pojatá. Pošlu si mailem na do Kindle schránky knihu. Přijde mi potvrzující mail s informací, že kniha dorazila, tady že je na ni link, odkud si ji mohu stáhnout, a přes USB zkopírovat do přístroje. To mi přijde opravdu ujeté. Naštěstí je tu další možnost. Webové rozhraní My Kindle Library má u jednotlivých položek pod tlačítkem Actions… odkaz Deliver to my… , který umožní pushnout titul do zařízení. A následuje nejistota, u kterých položek už jsem tuto akci provedl a u kterých ne. V My Kindle Library se to nepozná. Navíc celé tohle workflow má docela nepříjemné latence, zvlášť nepříjemná mi připadá ta mezi obdržením potvrzovacího mailu a okamžikem, kdy se titlu objeví v My Kindle Library. Docela bych uvítal možnost nastavit, že tituly, které přijdou do mailu, se pushnou do zařízení automaticky, takže bych si prostě poslal mail, na Amazon vůbec nemusel lézt a knihu našel na svém Kindlu.

No a proč mě tahle funkčnost vlastně zajímala? Chtěl jsem prověřit potenciální přínos čtečky pro své ne-tak-ajtý příbuzné. Ona je totiž na Amazonu dost hubená nabídka českých titulů, které je budou primárně zajímat, takže jsem hledal jiné zdroje. Nakoupil jsem na eReading.cz. Zakoupené tituly se dají stáhnout v různých formátech a mimo to i odeslat do zařízení (neboli na mail nastavený někde v zákaznickém profilu). A to je přesně to, co by bylo strašně krásné. Nakoupím u třetí strany, pošlu na Kindle mail a najdu to ve své čtečce. Proč ještě nastavovat něco v nějaké Library na Amazonu?