Jistěže lze kdykoliv zjistit typ objektu. Bohužel to pak dopadá třeba takhle https://github.com/dddomodossola/remi/blob/master/remi/gui.py#L1914 . V javě (a spoustě jiných jazyků) by se v této situaci (pokud bych to nechtěl celé postavit jinak, víc objektově) udělalo více metod append s různými vstupními parametry (Map, Collection, Widget) a každá by se chovala jinak. Jak to udělat v pythonu? Udělat metody appendDict, appendCollection, appendWidget? Nebo jednu metodu, která ale ve skutečnosti dělá pomocí if elseif... tři různé věci, jak je to v ukázce.
Nicméně samozřejmě nesouhlasím, že by se java neměla od pythonu co učit. Chybějící mixiny jsou zásadní nedostatek, o který zakopávám v jednom kuse. A defaultní metody interfaců to zdaleka neřeší, protože jsou public a interfacy nemají vnitřní proměnné. Tuples by se sakra hodily. Rovněž nemožnost volat kód s checkovanými výjimkami ve streamu je zásadní omezení modernizace legacy kódu. Končí to obalováním bloků runtime výjimkami, což je zbytečný balast. Python to v generátorech neřeší, příjemně se používají.
Na druhou stranu chápu, že java musí držet nějakou kompatibilitu a přidávání nových vlastností není úplně jednoduché. Přechod python2 -> python3 byl úplně špatně, to mi nikdo nevymluví. Ale i java má své problémy, technické změny v javě 9 zasekly spoustu projektů na osmičce (nepočítám-li změnu licence).
O kvalitě vývoje v enterprise si nedělám iluze :-)
Souhlas, osobne pouzivm Javu na tezsi veci a Python3 na skriptovani.
A zrozvna mixin mi vubec nechybi, to povazuju za pomerne nebezpecnou zalezitost co vede k pekne zamotanemu kodu.
Osobne se vubec snazim vyhnou dedeni a preferuju kompozici ve stylu Spring bean injection. Tim ddosahnes stejny vysledek a bezpecne, pripadne problemy bouchnou hned pri startu programu programu kde te Spring posle do zadele s cyklickymi referencemi apod.
Co se tyce tuples, ty mi taky nechybi. Vyrobit staticky bean v Ecplise je par kliku na generator, staci definovat atributy, zbytek dogeneruje IDE. A mam moznosti si treba interceptovat pro potreby debug pristup k jednotlivym atributum beanu pres injektovany logger, to s holym python tuplem neudelas.
dalsi aletrnativa je Lombok, tam vypada definice beanu takto:
@RequiredArgsConstructor
@Accessors(fluent = true) @Getter
public class LoginResult {
private final @NonNull Instant loginTs;
private final @NonNull String authToken;
private final @NonNull Duration tokenValidity;
private final @NonNull URL tokenRefreshUrl;
}
Krasne citelne, kazdy z fleku vidi co to dela, par radku kodu.
Streamy se snazim osobne nepouzivat, pouze pro jednoduche transformace collections apod. Stejne je z toho ve vysledku bytecode s foreach cyklem, to radsi napisu ten foreach rovnou a obetuju par radku kodu navic vymenou za lepsi citelnost.