images/logo.png
Nový obsah pouze na blog.sahaweb.cz Uživatel: Nepřihlášen

O programování 08 - Jak v Javě předat metodu, která bude mít různé parametry

k8

V minulém díle jsem řešil, jak předat v Javě metodu jako parametr, což lze díky funkčnímu interface. Zajímalo mě však ještě, jak předat metodu, která bude mít různé parametry. Metoda, která má různé typy parametrů (ale stejnou aritu) není problém, což ukazuje následující příklad, v němž jednou předávám metodu pro List Integerů a ve druhém případě List Stringů. (Pro naše účely se oprosťme od implementace metody pro String, která nedělá nic smysluplného.)



Function<List<Integer>, List<Integer>> methodListInteger = (List<Integer> inputList) -> { List<Integer> outputList = new ArrayList<>(inputList.size()); for (Integer integer : inputList) { outputList.add(++integer); } return outputList; };
Function<List<String>, List<Integer>> methodListString = (List<String> inputList) -> { List<Integer> outputList = new ArrayList<>(inputList.size()); for (String string : inputList) { outputList.add(Integer.parseInt(string) + 1); } return outputList; };
final List<Integer> outputList1 = methodListInteger.apply(new ArrayList<>()); final List<Integer> outputList2 = methodListString.apply(new ArrayList<>());

Tento zápis se mi celkem líbí, protože můžu celkem elegantně řešit různé transformace. V Javě jsem totiž omezen silnou typovou kontrolou, takže musím používat interface, dědičnost a generiky. Zmíněný Javový aparát bych ale stejně musel používat, pokud bych výše uvedený příklad chtěl používat k něčemu rozumnému, protože kromě metody musím předat i vstupní a výstupní parametry odpovídajícího typu. Jiným slovy, hledáme různě více či méně chytré způsoby jak obejít silnou typovost v Javě - což jde proti duchu jazyka, takže v tom zatím nebudu pokračovat.

Ještě před koncem těchto úvah se zmíním o další úrovni problému a to o případu metod s různým počtem parametrů. K této potřebě mě vedl praktický problém, kdy jsem mapoval různé beany na sebe. Napsal jsem univerzální mapper, který měl v 90% případů na vstupu jednu beanu a na výstupu druhou. Ovšem občas jsem potřeboval mapperu předat parametr navíc, sice to byl asi špatný návrh, protože jsme se toho během refactoringu zbavili, ale někdy to může být opravdu požadováno.

Řešil jsem to pomocí proměnného počtu parametrů (Object... beans) v metodě, což vůbec není dobré řešení. Musím totiž vědět, že tento konkrétní případ volání potřebuje více parametrů a jaké parametry jsou očekávány na vstupu. A zkontrolovat správnost i počet paramterů jsem schopen až v runtime, což degraduje silnou typovost Javy.

A tímto svoji úvahu na téma metody s různými parametry končím - vlastně to nepotřebuji a neodpovídá to ani principům Javy.

24.02.2017
k8
Přidat názor:
Vyhrazuji si právo libovolný komentář smazat bez udání důvodu. Kritika mi nevadí, ale chci omezit anonymní výkřiky, které nemají s tématem nic společného.
V textu je možné používat HTML tagy a tuto zjednodušenou MarkDown syntaxi
Jméno
Text
Postřehy:
09.04.2020: Pár poznámek o tom, jak fotit (nejen) modely
Tento článek obsahuje moje poznámky a postřehy týkající se focení modelů. Určitě nejde o návod pro ostatní, spíše si to chci sám ujasnit... Když někdo postaví model, vyfotí ho a prezentuje ho na internetu. Typická fotka bohužel vypadá zhruba jako na následujícím obrázku. Takováto fotka podle mě úsilí s tvorbou modelu dosti sráží. Mimochodem, ani se mi nepodařilo vyfotit model tak špatně, jak je
extravaganza.controverso@seznam.cz: Zdravím, krásný a informacemi nabitý blog. Musím pochválit. Plánuji rozjet undergroundový zin, co by se týkal black matalu, ambientu, satanismu, left hand
Poslední diskuse Postřehy
O programování 06 - Návrhové vzory - síla i slabina Javy
P.S. samozrejme "Context" mel byt "Client" .. To jsem jen narazil na nejak divne pojmenovany diagram.. (Context je samozrejme trosku neco jineho...)
...
David | 25.02.2017
O programování 06 - Návrhové vzory - síla i slabina Javy
To k cemu jsi dosel (tedy implementace LooperRunner + ILoopMethod), tak je ta prava Strategy by GoF :) To co je tam dulezite je ze Context (LooperRunner) je oddeleny od Strategy (ILoopMethod),
...
David | 25.02.2017
O programování 03 - Přehlednost funkcionálního zápisu v Java 8
Máš pravdu, to map je tam zbytečné. Odněkud jsem to opsal a nezkontroloval. Tím ovšem trochu padá pointa celého článku.
...
Saha | 14.12.2016
O programování 03 - Přehlednost funkcionálního zápisu v Java 8
Jen takova otazka k tomu druhemu prikladu:
Proc tam tu cast s "map" ktera de facto s prvky toho streamu nic nedela? Nestacilo by
list.stream().reduce(0, Integer::sum);
?
Ja teda moc
...
David P. | 13.12.2016
Paleo na půl - 01 - První tři dny bez mléka
Kvalitní hořké čokolády jsou bez mléka.. :) (a to i ty méně "kvalitní"). Mléko bývá součástí jen těch "sladkých".
...
David | 04.05.2015
Statistiky
Aktualizováno: 06.11.2020
Počet článků/fotek: 1397/13869
(C) Saha - 1990 - 2024 - Verze 1.4.1 - 11.11.2020 - Generated by SHREC 2.225 - SHWB
Veškeré zde uvedené materiály vyjadřují pouze moje soukromé názory (s výjimkou knihy návštěv a diskusí, kam může přispívat kdokoliv), a pokud s nimi někdo nesouhlasí, tak je to jeho problém, nikoliv můj.