Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
V Tiraně proběhl letošní Linux App Summit (LAS) (Mastodon). Zatím nesestříhané videozáznamy přednášek jsou k dispozici na YouTube.
Microsoft uvolní .NET Core, odlehčenou verzi .NETu, pod licencí MIT. .NET Core obsahuje malé běhové prostředí pro .NET aplikace a základní knihovnu tříd. Na rozdíl od .NET Frameworku, jenž podporuje pouze Windows, bude .NET Core navíc podporovat i Linux a Mac. Zdrojové kódy projektu .NET Core jsou dostupné na GitHubu.
Tiskni
Sdílej:
We are releasing the source under the MIT open source license and are also issuing an explicit patent promise to clarify users patent rights to .NET.
Microsoft Corporation and its affiliates ("Microsoft") promise not to assert any .NET Patents against you for making, using, selling, offering for sale, importing, or distributing Covered Code, as part of either a .NET Runtime or as part of any application designed to run on a .NET Runtime.
Těch důvodů bude pravděpodobně víc:
MS patří na černou listinu, ne mezi obchodní partnery a do slušné společnosti. U Adolfa Hitlera byste asi taky nenakupovali, kdyby si po Válce otevřel pekařství.
tak se MS bude chtít postavit na stranu vítězů a tvářit se, že není taková svině a že vlastně taky dělá ten open source.A že to nebude poprvé. Ale jak to vypadalo, to víme.
MS patří na černou listinu, ne mezi obchodní partnery a do slušné společnosti.Ve skutečnosti MS mezi obchodní partnery patří, protože je lze jen těžko ignorovat.
U Adolfa Hitlera byste asi taky nenakupovali, kdyby si po Válce otevřel pekařství.Docela zajímavé přirovnání. Jednak si myslím, že kdyby to bylo jediné pekařství nebo by něčím jiným vynikalo (i kdyby jenom cenou), tak by nemělo o zákazníky nouzi. Ze zásady tam nenakupovat by představovalo nepříjemné stigma, které by se projevilo například ve chvíli, kdy tě kamarád požádá, ať mu tam pro něco skočíš. Většina zásadových by to vydržela jen nějakou dobu a pak by si prostě na situaci zvykli.
MS se to bude snažit využít k tomu, aby nalákal uživatele a pak je stáhl zase do bahna proprietárního softwaru – dříve či později ti jeho obchodníci začnou tvrdit, jak ti „Core“ verze nestačí a jak potřebuješ tu „plnou“, která už je ale proprietární a placená. Bude se snažit navodit iluzi toho, že open source je něco méněcenného – jen na hraní, pro začátečníky, malé firmy… zatímco pro seriózní použití je potřeba jejich proprietární verze. Duální licencování je v pořádku, stejně tak je v pořádku účtovat si za svoje služby peníze, ale tahle asymetrie ve funkčnosti/vlastnostech mezi otevřenou a uzavřenou verzí je zlo – snaží se vyvolat zcela nesprávný dojem – ve skutečnosti je to ale naopak: ta otevřená/svobodná verze je ta nejvyšší verze, jaká může být, protože ti dává nezávislost a plnou kontrolu nad tím softwarem – zatímco méněcenná je ta uzavřená, protože je záměrně zmrzačená a uživatel nedostává vše, co by dostat měl.No popravdě řečeno, takhle dopadají všechny jazyky či technologie, které se snaží vyvinout a uzurpovat nějaká komerční firma. Tolik bahna jako když se člověk snaží pracovat s Javou jsem ještě nikdá neviděl a to Java patří rozhodně mezi ty lepší.
Můžeš to nějak rozvést? Používám OpenJDK, otevřené IDE, otevřené frameworky a knihovny, aplikační servery… v čem je problém?
Rád bych dodal, že k OpenJDK tak jak ho známe dnes to trvalo kolik? 15 let od uvedení Javy?
Patnáct ne. Java 1.0 vyšla v roce 1996, Sun vydal JVM pod GNU GPL v roce 2006, zbytek JDK pak v roce 2007.
RMS k tomu tehdy řekl:
I think Sun has contributed more than any other company to the free software community in the form of software. It shows leadership. It's an example I hope others will follow.
Ale hlavně: to že byl nějaký svobodný software kdysi uzavřený snad není jeho vada, ne? S tímto přístupem bys musel zavrhnout spoustu softwaru. Je naopak dobře, že se otevírají i dříve uzavřené věci – ne jen, že vznikají nové otevřené od samého začátku.
Díval bych se na to pozitivně: už přes osm let a přes tři hlavní verze je Java otevřená + OpenJDK je referenční implementace. Není to nějaká omezená edice nebo verze pro chudáky a začátečníky. U Javy je otevřené všechno – i ty nejvíc „enterprise“ věci, třeba aplikační servery nebo frameworky používané v bankách a telekomunikacích.
3 kompilátory, 3 různé edice včetně jakýchsi komunitních procesů, všelijaké (nepovedené) implementace
To přirozeně souvisí s tou otevřeností – stejně tak máme spousty GNU/Linuxových distribucí a mnohé z nich jsou nepovedené.
frameworky a bůh ví co.
A pro C, C++, Python, Perl a další nemáme nepřeberné množství knihoven a frameworků?
Otevřený inkrementálně aktualizovaný standard
Vždycky je potřeba nějaká autorita, která ten standard nakonec vydá, nemůže v tom být anarchie, protože potřebujeme jeden společný jazyk. Java má Java Community Process a tvorba tohoto standardu nefunguje vůbec špatně ve srovnání s procesem tvorby jiných standardů.
otevřená referenční implementace
Přesně to je OpenJDK.
a hotovo
Jak hotovo? Co si kdo napíše nad tím, jaké knihovny, frameworky, aplikace… to už je jeho věc – autoři jazyka/platformy to nemůžou nijak omezovat nebo regulovat.
Bohatě by stačilo doplnit GNU Classpath do kompletnosti, zprovoznit GCJ (resp. GIJ pro nekompilující lidi), uživatel si doinstaluje libgcj (stejně jako si musí nainstalovat libc) a o že je v pozadí nějaká Java nebo kráva ani nemusí vědět.
VM má svoje výhody. Ale souhlasím, že by bylo fajn dotáhnout i tu možnost kompilace do nativního kódu.
A všichni se s nějakýma implmentacema a edicema můžou jít bodnout.
Takže na klasickém „nechytrém“ mobilu s pár kilobajty paměti nebo dokonce na čipové kartě má běžet totéž, co na výkonných desktopech nebo na serverech? Desktopová platforma má mít podporu pro enterprise aplikace, když to vůbec není potřeba? Když si chci spustit jednoduchý CLI nebo desktopový program a nepotřebuji tam věci, které se používají na serverech?
Na takový bordel nejsem zvyklý. Ale co já vím, třeba jsem prostě moc rozmlsaný z OSS já.
Java ale je součástí toho OSS. Co tedy používáš? C, C++, Python, Perl, PHP…? Tam snad nejsou spousty knihoven a modulů?
Ale hlavně: to že byl nějaký svobodný software kdysi uzavřený snad není jeho vada, ne? S tímto přístupem bys musel zavrhnout spoustu softwaru. Je naopak dobře, že se otevírají i dříve uzavřené věci – ne jen, že vznikají nové otevřené od samého začátku....a přitom jsi výše přirovnal MS k Hitlerovi... Tyhle komentáře moc nechápu.
I think Sun has contributed more than any other company to the free software community in the form of software. It shows leadership. It's an example I hope others will follow.Znovu opakuju, že Java je ještě ten lepší příklad. Jak musí vypadat .NET se radši ani neptam.
Ale hlavně: to že byl nějaký svobodný software kdysi uzavřený snad není jeho vada, ne? S tímto přístupem bys musel zavrhnout spoustu softwaru. Je naopak dobře, že se otevírají i dříve uzavřené věci – ne jen, že vznikají nové otevřené od samého začátku.Já to jen a pouze porovnávám s věcma, které byly standardizovány a vyvíjeny jako otevřené už od počátku. Prostě v nich není tolik bordelu.
Přesně to je OpenJDK.Jo. OpenJDK je fajn. Ale porovnej to třeba (bohužel s nekompletním) GNU Classpath. Tak to mělo vypadat.
Takže na klasickém „nechytrém“ mobilu s pár kilobajty paměti nebo dokonce na čipové kartě má běžet totéž, co na výkonných desktopech nebo na serverech?A včil to porovnej s Linuxovým jádrem. To má také své edice (třeba uClinux, nevím jestli se pro Enterprise používá něco jiného než vanika), ale vdžycky je u něj ta snaha ty „edice“ asimilovat do mainline tak aby hlavní větev byla co nejuniverzálnější. Ono dokud člověk nevidí jak to dělají ostatní, tak si ani neuvědomuje jak dobře některé věci jsou implementované (jako třeba to Linuxové jádro). Si představ že by si měl Linux ME, Linux SE, Linux EE a každé by mělo své vlastní verze. A nebo si představ že by si měl ještě v kadžé verzi nějaké GUI implementované v podobě AWT, Swingu, Java FX – ježišku, ještě zlaté Qt/GTK.
Java ale je součástí toho OSS. Co tedy používáš?Bohužel. A možná to má taky důvod, že se jí každý snaží vyhýbat co to jde.
Sice to není OS, jen desktopové prostředí, ale napsali – viz projekt Looking Glass. Steve Jobs kvůli tomu tehdy volal Jonathanovi Schwartzovi a vyhrožoval Sunu soudním sporem.
Koukni taky na JNode a JX. Případně Jazelle (spouštění javovského bajtkódu přímo na ARMových procesorech).
Případně JazelleJo a to mi pije krev. Proč sakra na x86 musím tu binární ludru emulovat ve VM? Tfuj tajcl, hnus zeleený jakýsi.
Hmm, Squeak je náhodou super. Skvelá hračka na odreagovanie sa a vyskúšanie si niečoho nového.
Nového pre mňa, nie nového v zmysle veku technológie. Samozrejme taký smalltalk je pomerne starý ale pre niekoho môže byť takýto prístup k OOP "nový".
Protože v podstatě v každým OS je Java takový vetřelecMyslím si že přirováním Javy k vetřelcovi naprosto v každém systému si to popsal naprosto dokonale. Aneb „nuff said“. A přitom by to vůbec nebylo nutné.
Nemůžete kdyžtak rozebrat proč vám Java připadá v každém systému jako vetřelec? Oběma vám to přijde přesné, ale žádné argumenty jste k tomu nedali...Není to jen takový pocit lidí, co Javu vlastně ani neznají?Protože v podstatě v každým OS je Java takový vetřelecMyslím si že přirováním Javy k vetřelcovi naprosto v každém systému si to popsal naprosto dokonale. Aneb „nuff said“. A přitom by to vůbec nebylo nutné.
Řekl bych, že pocity obou tábotů jsou irelevantní.Divné, když je to hlavní téma tvého příspěvku.
Argumenty, třeba nějaké příklady, by mi přišli zajímavější.Nač plýtvat argumenty na něco tak očividného?
Argumenty, třeba nějaké příklady, by mi přišli zajímavější.
Taky si myslím, že by nějaký argument neuškodil. Třeba proč je Java někde větší vetřelec než pythonovský/perlovský atd. program v OS/prostředí napsaném v C. Nebo třeba než GTK aplikace v Qt prostředí.
Třeba proč je Java někde větší vetřelec než pythonovský/perlovský atd. program v OS/prostředí napsaném v C.V takovém prostředí (například OpenWRT) by se jistě dalo uvažovat o Pythonu jako o „vetřelci“.
Nebo třeba než GTK aplikace v Qt prostředí.V takovém prostředí se GTK aplikace za „vetřelce“ pokud vím běžně považuje.
Otázka byla: „proč je Java větší vetřelec než třeba…“
Otázka byla: „proč je Java větší vetřelec než třeba…“Reakce, že větší vetřelec nutně nemusí být, ti nepřijde dostatečně relevantní?
Otázka byla: „proč je Java větší vetřelec než třeba…“
Ostatní jazyky poskytují pohodlnou abstrakci
Takže i na ne-POSIXových systémech to bude nabízet všechny POSIXové funkce? To asi ne.
ale pořád máte přístup k operačnímu systému
V Javě mám JNI a JNA. Díky tomu jde udělat v Javě cokoli. Tohle je spíš otázka, co bude ve standardní knihovně a co bude v knihovnách třetích stran. Java jde tou cestou, že standardní knihovna je spíš jednodušší a obsahuje to, co jsou její autoři schopní podporovat na všech platformách. To ostatní jde v Javě taky, jen to prostě není ve standardní knihovně.
V Javě můžu mít i třeba nativní Qt GUI…
Abych mohl volat nativní funkce, stačí mi v Javě díky JNA definovat rozhraní:
public interface POSIX extends Library { public int chdir(String filename); public int chmod(String filename, int mode); public int chown(String filename, int user, int group); public int rename(String oldpath, String newpath); public int kill(int pid, int signal); public int link(String oldpath, String newpath); public int mkdir(String path, int mode); public int rmdir(String path); }
A pak ho napojit a použít:
POSIX posix = (POSIX) Native.loadLibrary("c", POSIX.class); posix.chdir("/tmp");
A právě proto je Java vetřelec.
Třeba se signály vám žádné JNI nepomůže, protože obsluhu signálů si uzurpuje JVM pro vlastní potřebu. Dokážu si představit, že existují knihovny, které vyrobí nový proces a přes něj budou používat signály, ale to jaksi už není ten samý proces, že.
dd
), ale na cokoli jiného - nedejbože třeba IPC - jsou celkem k ničemu.
Jinak ono přes to JNI by nejspíš šlo používat POSIX API a všelijaká další API, jen kdyby to v Javě někdo používal Jinak ono přes to JNI by nejspíš šlo používat POSIX API a všelijaká další API, jen kdyby to v Javě někdo používalProc by to nekdo pouzival, kdyz to do Javy nepatri? Tim, ze budes mit pres JNI prilinkovane POSIXove API, prichazis o prenositelnost... a ze zkusnosti mohu rict, ze casto i o doprednou kompatibilitu. Uz mockrat jsem videl, ze projekty pouzivajici JNI po par letech nesly prelozit, protoze prekladace C++ a souvisejici knihovny se za tu dobu vyvinuly v neco nekompatibilniho s puvodnim kodem.
Proc by to nekdo pouzival, kdyz to do Javy nepatri?Tahle věta hezky podtrhuje toho "vetřelce". Non-Java věci se nepoužívají, protože "to do Javy nepatří"...
Tim, ze budes mit pres JNI prilinkovane POSIXove API, prichazis o prenositelnost...Přenositelnost nemusí být priorita nebo se může nahradit multiplatformitou, což bývá někdy případ i Java aplikací. Jinak POSIX API je jen příklad, obecně jde o jakékoli non-Java API.
a ze zkusnosti mohu rict, ze casto i o doprednou kompatibilitu. Uz mockrat jsem videl, ze projekty pouzivajici JNI po par letech nesly prelozit, protoze prekladace C++ a souvisejici knihovny se za tu dobu vyvinuly v neco nekompatibilniho s puvodnim kodem.Problémy s dopřednou kompatibilitou se týkají více či méně v podstatě čehokoli, vč. čistě Java projektů...
Přenositelnost nemusí být prioritaA co kdyz je?
Problémy s dopřednou kompatibilitou se týkají více či méně v podstatě čehokoli, vč. čistě Java projektů...Java je zpetne/dopredne kompatibilni az v to nekterych ohledech neni hezke, protoze v zajmu zachovani zpetne kompatibility musela byt udelana rada kompromisu v novych verzich. Programy, ktere byly psane pro Javu 1.2, 1.3 mi dneska v pohode bezi na Jave 1.8 a neni problem je zaclenit jako soucast do dnesnich programu s tim, ze prekladac pouze rve warningy. Na druhou stranu programy, co byly napsany s vyuzitim JNI, kvuli primemu pristup k OS, mi dnes vetsinou ani nejdou prelozit, protoze C++ a souvisejici knihovny se vyvinuly v neco nekompatibilniho.
A co kdyz je?Pak dočti větu do konce?
Programy, ktere byly psane pro Javu 1.2, 1.3 mi dneska v pohode bezi na Jave 1.8 a neni problem je zaclenit jako soucast do dnesnich programu s tim, ze prekladac pouze rve warningy.O tom to ale není. Nejnovější GCC nebo Clang ti taky přeloží C++98. Problém je v dependencích. I v Javě se mi stávalo, že jsem musel patchnout kód, protože se změnila nějaká závislost. Tomu se nevyhneš nikde.
Na druhou stranu programy, co byly napsany s vyuzitim JNI, kvuli primemu pristup k OS, mi dnes vetsinou ani nejdou prelozit, protoze C++ a souvisejici knihovny se vyvinuly v neco nekompatibilniho.C++ se v "něco nekompatibilního" nevyvinulo už hezkou řádku let, zhruba od doby, kdy má standard. Jestli ono se spíš nevyvinulo JNI, OS nebo nějaké 3rd party knihovny.
C++ se v "něco nekompatibilního" nevyvinulo už hezkou řádku let, zhruba od doby, kdy má standard.Viz třeba What breaking changes are introduced in C++11? Navíc ani různé C++ překladače nemusí být vzájemně kompatibilní, tudíž používat nativní C++ knihovny nemusí být snadné ani z C++.
Ok, díky za info. Je fakt, že ty keywordy mě měly napadnout, to je celkem zjevná změna. Nicméně třeba u GCC nebo Clang je přepínačC++ se v "něco nekompatibilního" nevyvinulo už hezkou řádku let, zhruba od doby, kdy má standard.Viz třeba What breaking changes are introduced in C++11?
-std=...
, že, s kterým by tohle neměl být problém...
Navíc ani různé C++ překladače nemusí být vzájemně kompatibilní, tudíž používat nativní C++ knihovny nemusí být snadné ani z C++.To je pravda, když lidi používaj všlijaká nestandardní rozšíření, je problém. Dále problémy s ABI, že... Btw. různé překladače/VM Javy kompatibilní jsou?
Btw. různé překladače/VM Javy kompatibilní jsou?Naprosto bezne a bez problemu. (Napr. Eclipse ma svuj vlastni prekladac a vygerenovany JBC jde pouzit na libovolnem JVM s kodem prelozenym jinymi prekladaci.) Java ma vcelku rozsahlou sadu testu (JCK), kterou musi implementace projit, aby dostala certifikaci. Coz u ostatnich jazyku je vcelku rarita.
AFAIK Eclipsi prekladac je normalni javac z OpenJDK s nejakou sadou patchuNeni. Schvalne jsem se ted dival do zdrojaku ECJ a vsude je tam puvodni copyright IBM, nic od SUNu/Oraclu. Logicky to dava smysl, kdyz Eclipse tu byl spoustu let pred otevrenou Javou a Eclipse je pod EPL a ne GPL.
Ty jsou dobré max. tak na posílání ^C a ^Z v konzoli
Na Ctrl+C můžeš zareagovat takto:
Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { System.out.println("Uživatel stiskl Ctrl+C / končí program"); } });
A Ctrl+Z uspí javovský program jako kterýkoli jiný.
Kdyby SIGINT se řešil stejně, jako níže uvedený SIGHUP, tak budu zticha. Tento kód ale vůbec neobsluhuje SIGINT. To je právě ta vetřelecká technika, která dělá z javové aplikace aplikaci druhé třídy, která nemá stejné možnosti, jako nativní aplikace.
Já chápu, že každý virtuální stroj více či méně staví hráz mezi aplikaci a systém a že výsledné možnosti jsou kompromis. V tomto směru každá nenativní aplikace je menší nebo větší vetřelec. Java mi ale ve srovnání s Perlem nebo Pythonem přijde jako mnohem větší vetřelec.
A právě proto je Java vetřelec.
Nějak mi není jasné, co v mém komentáři je to „právě proto“…
Nicméně signály můžeš zpracovávat v Javě takto:
SignalHandler sh = new SignalHandler() { @Override public void handle(Signal sig) { System.out.println("Zachycen signál: " + sig); } }; Signal.handle(new Signal("HUP"), sh); Signal.handle(new Signal("USR2"), sh);
A co se týče volání nativních funkcí – jaký pohodlnější způsob by sis představoval? Nemuset deklarovat ani to rozhraní? Jasně, šlo by jen někam napsat název volané funkce bez jakékoli přípravy a dynamicky to spustit. Ale v Javě prostě není zvykem střílet od boku a doufat, že na sebe nějaké dva textové řetězce budou pasovat. A to je podle mého dobře a přispívá to ke spolehlivějším programům a efektivnějšímu vývoji.
SignalHandler
použil, ale zřetelně si pamatuji, že byl umístěn v balíku sun.misc
, tzn. nejednalo se nikdy o oficiálně podporovanou ani povinnou součást JVM.
Ano, tyhle konkrétní třídy jsou bohužel v sun.misc
a třeba pomocí GCJ to přeložit nejde, ale už to, že tyto třídy existují dokládá, že zpracování signálů v Javě možné je – když nemůžeš použít sun.misc
, tak si ty nativní funkce můžeš zavolat sám pomocí JNI, nebude v tom žádná magie, nic, co by nešlo. Resp. stačí zavolat z nativního kódu metodu v Javě, což lze.
A včil to porovnej s Linuxovým jádrem. To má také své edice (třeba uClinux, nevím jestli se pro Enterprise používá něco jiného než vanika)
Moc ne – v běžném „enterprise“ se používá běžné jádro, třeba nějaké standardní z RedHatu nebo jiné distribuce. Pokud má někdo farmu o tisících serverech nebo speciální HW, tak si tam asi přeloží něco vlastního a optimalizuje. Nebo nějaké RT… ale většina pojede na standardních distribučních jádrech.
ale vdžycky je u něj ta snaha ty „edice“ asimilovat do mainline tak aby hlavní větev byla co nejuniverzálnější.
Co se týče Javy SE a Javy EE, tak tady v tom není problém. Java EE je soubor API předepsaný specifikací, které má poskytovat aplikační server (JBoss, GlassFish atd.), ale celé to běží nad úplně standardní Java SE JRE. Tzn. zjednodušeně řečeno Java EE = Java SE + nějaké API a knihovny navíc. A smysl je v přenositelnosti – píšeš enterprise aplikaci pro platformu Java EE a ta pak bude chodit na všech aplikačních serverech, které vyhovují specifikaci. Tenhle princip je v Javě obecně dost silný: specifikace/rozhraní + jedna nebo víc implementací. A ty implementace můžeš měnit jen pomocí konfigurace a aplikace zůstávají stejné, protože pracují s tím rozhraním, abstraktním API.
Něco jiného je Java ME a JavaCard, ty jsou hodně osekané a dost jiné – ty věci z Javy SE/EE těžko nacpeš do starého mobilu nebo na malou kartičku (třeba SIMku – i když dneska možná i ano, na SIMce se dneska dá provozovat i webový server…) a na druhou stranu: stylem jakým se programují ty karty bys asi nechtěl psát na plnohodnotném počítači.
Si představ že by si měl Linux ME, Linux SE, Linux EE a každé by mělo své vlastní verze.
Linux je jen jádro, to je více méně stejné, ale když se budeme bavit o celém operačním systému, tak něco takového tu už dávno je. Můžeš mít holý Linux a uvnitř něj spustit jeden program, třeba Emacs. Nebo můžeš mít Linux + Busybox. Nebo Linux + GNU (nejčastější varianta). Nebo GNU/Linux a nad ním třeba systemd, nebo ještě KDE nebo Gnome, nebo Enlightenment. Můžeš tam mít zakompilované různé moduly, třeba pro podporu různých FS. Různé POSIX věci, všelijaké API a služby, šifrovací algoritmy, plánovače, různé démony…. Ta variabilita je… nekonečná. Oproti tomu je volba Java SE vs. Java EE (případně ME, JavaCard) ještě zlatá.
A nebo si představ že by si měl ještě v kadžé verzi nějaké GUI implementované v podobě AWT, Swingu, Java FX – ježišku, ještě zlaté Qt/GTK.
Java je tu osmnáct let, změnit za tu dobu jednou API pro GUI, to není zase taková tragédie. Ono aplikace psané pro staré Qt nebo staré GTK na tom dnešním taky jen tak nerozchodíš a musíš je portovat. Java FX je spíš něco jako QML vůči Qt.
Tady je taky vidět odlišný přístup – Qt se jmenuje pořád Qt, GTK se jmenuje pořád GTK, i když jsou oproti starým verzím hodně jiné a nekompatibilní. Kdežto v Javě se stará verze jmenuje AWT a nová Swing. Ale zase ti i dneska bude chodit aplikace, kterou jsi napsal před patnácti lety.
A možná to má taky důvod, že se jí každý snaží vyhýbat co to jde.
Každý ne, ale jsou takoví, to připouštím. Za tohle můžou jednak autoři aplikací a jednak si za to může Java taky trochu sama – pomalejším startem VM. Je to v zásadě už minulost, ale hodně lidí si toho ještě nestihlo všimnout. Moje javovské aplikace se dokáží za 300 ms spustit, udělat něco užitečného a ukončit proces. To je celkem slušné. Mohlo by to být lepší, ale tyhle časy jsou už přijatelné i pro interaktivně spouštěné příkazy v konsoli.
píšeš enterprise aplikaci pro platformu Java EE a ta pak bude chodit na všech aplikačních serverech, které vyhovují specifikaci.Tak určitě...
a) aplikace neodpovídá specifikaci b) aplikační server neodpovídá specifikaci
Ale jestli máš nějakou variantu c), tak jsi ji klidně mohl napsat místo těch smajlíků.
Ano, jistě. Přičemž a) a/nebo b) nastane cca v 99,9999% reálných příkladů, takže je to celé k hovnu, ale jinak teoreticky určitě výtečně vymyšlené.a) aplikace neodpovídá specifikaci b) aplikační server neodpovídá specifikaci
Pokud nastane b), měl by aplikační server přijít o certifikaci nebo rychle vydat opravu. Pokud nastane a) může si za to programátor aplikace sám, nemá se vymlouvat na Javu. Je to asi jako když někdo píše bashismy a pak se diví, že jeho skripty nefungují s libovolným /bin/sh
.
Pokud nastane b), měl by aplikační server přijít o certifikaci nebo rychle vydat opravu. Pokud nastane a) může si za to programátor aplikace sám, nemá se vymlouvat na Javu.A mezi tím nám jak hadr na holí lítá uživatel (zákazník), kterého střídavě posílají do zadele jak autoři JRE/aplikačního serveru, tak autor aplikace. První s tím, že si má nainstalovat novou verzi, že stará je už nepodporovaná, druhý s tím, že nová verze je moc nová a proto nepodporovaná. Opravdu skvělé. A mimochodem, čo si tak predstavujete pod takým termínom "standardní Java SE JRE", Kefalín? Nic takového neznám, a jinak ten "standard" rozbíjí v poslední době prakticky každá bezpečnostní záplata toho děravého monstra.
Java Language and Virtual Machine SpecificationsHmmm, a co s tímhle mám jako zákazník/uživatel pendlující mezi děravou Javou a nefunkční aplikací dělat?
Přejít na COBOL, ten už moc děravý není, nebo je děravý pořád stejně a moc aktualizací pro něj nevychází.
Specifikace C# jako taková je IMHO velmi, velmi povedená, syntakticky to zkrátka dává smysl.To platilo tak do verze C# 2.0. Pak se urvali z retezu a zacali pridavat kde co. Hlavne ,,vychytavky'' kvuli Linq docela zprznily cely jazyk.
Komentáře zase stojí za to, co vlastně chcete?Chceme aby šel MS k šípku, vždyť jsi to sám napsal.
obávám se, že to místní prskalové budou muset akceptovat.Nejenom místní, nejenom prskalové a nejenom pozici a chování microsoftu ;).
Nejdřív búúú, MS kašle na linux
Na to si fakt někdo někdy stěžoval? Od MS Windows jsem přešel dobrovolně a za lepším, nestojím o to, aby se mi MS programy cpaly i do mého operačního systému, natož abych se o ně doprošoval.
MS evidentně není tak zabedněný
Zabedněný, nezabedněný, dokud měli svojí pozici jistou a zákazníky pevně v hrsti, tak se na nikoho jiného neohlíželi. Naopak se všechny ostatní snažili zadupat do země a poškodit.
podporou linuxu nesleduje nic jiného, než zvýšení tržního podílu (proč podporuje office na iOS a MACOS, proč se zabývá podporou linuxu v Azure?
To, co se v MS děje teď, není nějaké dobro nebo prozření, ale jen důsledek toho že jim ujel vlak, jejich byznys model se zhroutil a na mrtvém koni už nejde jet, ani když se o jeho oživení bude snažit sto padesát obchodníků. Tohle jsou už jen dojezdy (i když v takových janouškových republikách, jako je ČR, můžou státní správu dojíždět ještě pár let). Chování Microsoftu nápadně připomíná převlékání kabátů po různých revolucích a převratech. Ale převléknutím kabátu se člověk ještě nestane demokratem, árijcem, komunistou nebo antikomunistou… jen se tak bude snažit vypadat.
Nechápem prečo sa tu niektorí tak rozčulujú. Či tam už OpenSource nie je zaujiamvé? Podľa mňa je to výborná správa. .NET framework je dobre popísaný, C# je zdá sa dosť popredu voči Jave: (http://www.wikiwand.com/en/Comparison_of_C_Sharp_and_Java). Aha, ale to je od Microsoftu, tak to musí byť zlé, už len preto že je to Microsoft??Co to je zase za kecy. Ne každý musí milovat Javu a tedy ne každý musí milovat něco, co je (údajně) napřed. Stejně jako ne každý musí milovat všechno, co je (údajně) open source, ale ani všechno, co vypadne z Microsoftu. Dotnet je jistě velmi zajímavá platforma, která navíc měla už dlouhou dobu alternativní linuxovou implementaci a lidem, kteří ji chtějí používat opensourcování jakékoli části jistě pomůže, ale to přece neznamená, že se všichi posadíme na prdel z toho, že někdo vydal nějaký open source kód.
To jsou spíš problémy způsobené americkým právním řádem a soudnictvím – v zemi neomezených možností se pořád někdo s někým soudí a armády právníků jsou vysílány do bitev.
C# je dnes lepsi jazyk…Vážně? AFAIK tam pořád nemají ani kontrolované výjimky.
vsechny metody "throws Exception". Vyznam checked exception 0Jo, to jsem si taky myslel, do te doby, nez mi pri predavani program v C# spadl na exotickou vyjimku, ktera se mohla objevit jen za urcitych okolnosti pri zapisu na sitove disky, a ktera byla ocekavana zhruba asi jako spanelska inkvizice.
typicky zmena implementace meni signaturu (kontrakt) metodyPokud nechas probublat ven interni problemy je to tvuj problem.
implementace metod checked vyjimky chyta, zaloguje, a vyhodi vysTohle nechapu. Toto jako s unchecked vyjimkama nejde nebo se nedela?
Druhy typ jsou osetritelne vyjimky - pro tyto vyjimky mame nejake osetreni - vime, jak na to reagovat. Takove vyjimky chytame nekde pomerne blizko k misto, kde se vyhazuji.A na to jsou prave checked vyjimky. Je to zpusob, jak manifestovat, ze metoda muze skoncit jinak nez ocekavanou navratovou hodnotou.
Kdyz volam IO operace, tak vim, ze muze dojit k nejakemu IO problemuOno je to jen malinko jinak... protoze ty jen tusis, ze muze dojit k nejakemu problemu, unchecked vyjimky ti udavaji, ze k tomu problemu opravdu muze dojit a vnitrni kod vyvola vyjimku. Teoreticky protipriklad: ono se totiz mohlo stat, ze nekdo IO naprogramoval tak chytre, ze vsechny operace problem tise ignoruji a tys mohl s timto resenim pocitat.
Jo, to jsem si taky myslel, do te doby, nez mi pri predavani program v C# spadl na exotickou vyjimku, ktera se mohla objevit jen za urcitych okolnosti pri zapisu na sitove disky, a ktera byla ocekavana zhruba asi jako spanelska inkvizice.Hmm, takže s checked exceptions se ti nemůže stát, že ti do té funkce odněkud probublá nějaká jiná výjimka?
void foo() throws EA, EB
, která vevnitř volá x dalších funkcí na y dalších objektech, třeba. Je možný, aby jedno z těch volání vyhodilo EC
? A co by se stalo, pokud ano?
Pokud je EC checked vyjimka, tak takovy kod nepujde prelozit, protoze pak i foo() musi mit deklarovane throws EC.To mi moc nejde dohromady s tou diskusí o generikách níže (kompilátor nezná generický typ) + tuším má Java nějakou reflexi (vzpomínám se, že jsme v jakémsi školním projektu někde vytvářeli novou třídu z jejího jména)... Ale dobře dejme tomu, že to asi není moc pravděpodobné... Ok, takže shrnutí: Při posuzování čistě z definice funkce, funkce bez specifikace výjimek může a nemusí vyhodit jakoukoli exception. Funkce se specifikací může a nemusí vyhodit jakoukoli unchecked exception, kteroukoli checked exception ze seznamu, ale dost pravděpodobně nevyhodí jinou checked exception (tj. zejména jestliže nepoužívá generika a není vevnitř nějak zprasená reflexí nebo nějak jinak). Jestli to je užitečné, ať si posoudí každý sám, jednoznačný objektivní benefit tam ale nevidím. Stejně si člověk musí vždycky přečíst dokumentaci k cizím rozhraním včetně toho, kdy mohou nastat neplatné stavy a co se pak děje...
To mi moc nejde dohromady s tou diskusí o generikách níže (kompilátor nezná generický typ)Kompilator typovy parametr u genericky trid zna! Behove prostredi jej nezna.
tuším má Java nějakou reflexiAno, Java reflexi ma, ale nevim, jakou to tu hraje roli...
funkce bez specifikace výjimek může a nemusí vyhodit jakoukoli exceptionNe, funkce bez specifikace vyjimek muze vyhodit pouze unchecked vyjimky.
ale dost pravděpodobně nevyhodí jinou checked exceptionNe, nevyhodi na 100% zadnou jinou checked exception, nez tu, ktera je ve vyctu. Pokud bys tam pouzil reflexi bude i checked vyjimka zabalena do unchecked. Generika na to nemaji zadny vliv, tam jsou vyjimky odvozene z typoveho parametru.
Stejně si člověk musí vždycky přečíst dokumentaci k cizím rozhraním včetně toho, kdy mohou nastat neplatné stavy a co se pak děje...Ten benefit je v tom, ze prekladac te upozorni napripadne chybove stavy, i kdyz to v dokumentaci nenajdes (protoze napr. neexistuje, je nekompletni) nebo kdyz to prehlednes.
Ne, nevyhodi na 100% zadnou jinou checked exception, nez tu, ktera je ve vyctu. Pokud bys tam pouzil reflexi bude i checked vyjimka zabalena do unchecked.Ok, oprava, jiné checked exceptions jsou přeměněny na unchecked
Ten benefit je v tom, ze prekladac te upozorni napripadne chybove stavy, i kdyz to v dokumentaci nenajdes (protoze napr. neexistuje, je nekompletni) nebo kdyz to prehlednes.Upozorní tě na některé chybové stavy (jiné stavy mohou vyvolat unchecked exception nebo se nemusí projevit výjimkou), navíc bez dokumentace (a pozorného čtení
Viz tadyUznavam, pokud zacnes prasit s Unsafe, apod. opravdu muzes mit takovou vyjimku... ale to te pravdepodobne cekaji jeste desivejsi veci.
Upozorní tě na některé chybové stavyPorad lepsi nez nic. Je potreba si uvedomit, ze Java byl navrzeny jako jazyk s ohledem na bezpecnost a prekladac, te z toho duvodu nuti explicitne resit vyjimecne stavy.
Jde mi o to, ze pokud vsechny metody "throws Exception", pak je informacni hodnota tohoto statementu 0. Zaroven vyznam checked exceptions pada, protoze vas to nenuti je osetrovat (prave kvuli tomu, ze i klientsky kod deklaruje "throws Exception"). Cele je to pak jen sarada bez jakehokoli vyznamu.vsechny metody "throws Exception". Vyznam checked exception 0Jo, to jsem si taky myslel, do te doby, nez mi pri predavani program v C# spadl na exotickou vyjimku, ktera se mohla objevit jen za urcitych okolnosti pri zapisu na sitove disky, a ktera byla ocekavana zhruba asi jako spanelska inkvizice.
Z mych zkusenosti je to hlavne problem lidi, kteri kod prebiraji. Jeste horsi je to v tom, ze lidi si pak mysli, ze pomoci tech IOException a JsonProcessingException muzou ridit chod programu. Jakoze odchyti IOException a rikaji si - jo, to je urcite vyjimka vyhozena z toho a toho mista, ale ona je ve skutecnosti vyhozena uplne jinde. Vyjimky (obzvlast checked) jsou soucasti kontraktu, to ale lidi dost casto ignoruji.typicky zmena implementace meni signaturu (kontrakt) metodyPokud nechas probublat ven interni problemy je to tvuj problem.
Samozrejme jde, jen tento antipattern vidim temer vyhradne u checked exceptions.implementace metod checked vyjimky chyta, zaloguje, a vyhodi vysTohle nechapu. Toto jako s unchecked vyjimkama nejde nebo se nedela?
Ale to prece muzete manifestovat i bez checked vyjimek. Do "throws" muzete klidne pridat i RuntimeException. Rozdil je v tom, ze checked exceptions vas nuti ke zbytecnym try-catch boiler plate kodu, kdyz se rozhodnete vyjimku neosetrovat.Druhy typ jsou osetritelne vyjimky - pro tyto vyjimky mame nejake osetreni - vime, jak na to reagovat. Takove vyjimky chytame nekde pomerne blizko k misto, kde se vyhazuji.A na to jsou prave checked vyjimky. Je to zpusob, jak manifestovat, ze metoda muze skoncit jinak nez ocekavanou navratovou hodnotou.
Opet, ja jsem rad, kdyz metody popisuji svuj kompletni API kontrakt, tj. vcetne vyjimek. Jsem ale nerad, kdyz si vynucuji specialni osetreni i kdyz ho nepotrebuji.Kdyz volam IO operace, tak vim, ze muze dojit k nejakemu IO problemuOno je to jen malinko jinak... protoze ty jen tusis, ze muze dojit k nejakemu problemu, unchecked vyjimky ti udavaji, ze k tomu problemu opravdu muze dojit a vnitrni kod vyvola vyjimku. Teoreticky protipriklad: ono se totiz mohlo stat, ze nekdo IO naprogramoval tak chytre, ze vsechny operace problem tise ignoruji a tys mohl s timto resenim pocitat.
Jde mi o to, ze pokud vsechny metody "throws Exception", pak je informacni hodnota tohoto statementu 0Aha, takze ono to bylo mysleno doslova... tak to je pak jina... Pokud nekdo cpe do kodu doslova "throws Exception" tak je to prase a dalsi diskuze je bez predmetna, protoze za to programovaci jazyky ani checked vyjimky opravdu nemohou.
Z mych zkusenosti je to hlavne problem lidi, kteri kod prebiraji. Jeste horsi je to v tom, ze lidi si pak mysli, ze pomoci tech IOException a JsonProcessingException muzou ridit chod programu. Jakoze odchyti IOException a rikaji si - jo, to je urcite vyjimka vyhozena z toho a toho mista, ale ona je ve skutecnosti vyhozena uplne jinde. Vyjimky (obzvlast checked) jsou soucasti kontraktu, to ale lidi dost casto ignoruji.Ale to je chyba tech programatoru, ze nedokazi pouzivat vyjimky spravnym zpusobem a nehraje roli jestli je to unchecked nebo checked exception.
Rozdil je v tom, ze checked exceptions vas nuti ke zbytecnym try-catch boiler plate koduToto fakt nechapu. Nikdo te nenuti. Bud tu vyjimku odchytis a pak to mas to same jako s RuntimeException nebo ji delegujes dal a pak to mas stejne, jako by tam byla RutimeException, jen to deklarujes jako soucast metody.
Jsem ale nerad, kdyz si vynucuji specialni osetreni i kdyz ho nepotrebuji.Nevynucuje, kdyz tu vyjimku v dane metode neumis zpracovat, predas ji volajicimu. V takovem pripade, ale musis brat v potaz, ze metoda nemusi skoncit vracenim hodnoty, ale vyjimkou a tudiz je nutne to uvest do kontraktu.
Toto fakt nechapu. Nikdo te nenuti. Bud tu vyjimku odchytis a pak to mas to same jako s RuntimeException nebo ji delegujes dal a pak to mas stejne, jako by tam byla RutimeException, jen to deklarujes jako soucast metody.Bud napisu kus boiler-plate kodu nebo musim menit interface svych metod. Pokud se rozhodnu zmenit interface, musim to same rozhodnuti resit na vyssich vrstvach. Navic se mi vubec nelibi, ze by nejaka metoda z business logiky mela deklarovat, ze "throws JsonProcessingException" - kdo ma co vedet, ze tam delam neco s JSONem. Jeste to budou chapat jako soucast publikovaneho kontraktu a zacnou to nejak specificky osetrovat. Samozrejme to muzu skryt boiler-plate kodem, ale cele se mi to zda strasne zbytecne ... To cele kvuli vyjimce, ktera me totalne vubec nezajima. S tim API kontraktem je to slozitejsi. Pokud delam nejake API, tak v JavaDocu (pripadne v throws) popisuju, ktere relevantni vyjimky kdy vyhazuju. Implicitne z povahy jazyka je taky jasne, ze se z te metody muzou vyhazovat i jine vyjimky. Ty ale nepopisuju (nepublikuju), protoze jsou spis dane implementacnimi detaily a klient tohoto API by je mel bez rozdilu chapat jako "neco se posralo, nemuzu pokracovat". Pokud implementaci zmenim, budu asi vyhazovat jine Runtime vyjimky - proto se k nim nechci zavazovat. A ted si predstavim, ze jsem klient API. Toto API deklaruje, ze vyhazuje ty a ty vyjimky. Oka, to je fajn - v mem pripade je ale nechci osetrovat, protoze nevim co s nimi. Nechci je ale pridavat do throws meho interface, protoze tim je vystavuju (a zaroven se k nim zavazuju), i kdyz z hlediska meho kontraktu jsou spis implementacnim detailem a chtel bych, aby je klient chapal jako "neco se posralo, nemuzu pokracovat". Nemuzu tedy delat nic jineho nez je obalit naprosto zbytecnym try-catch blokem.
V takovem pripade, ale musis brat v potaz, ze metoda nemusi skoncit vracenim hodnoty, ale vyjimkou a tudiz je nutne to uvest do kontraktu.To je ale prece implicitni soucast kontraktu vsech metod - kazda metoda (i s prazdnou implementaci) muze vyhodit vyjimku. Nechci ji uvadet do kontraktu, protoze z hlediska kontraktu meho API neni relevantni (je to spis implementacni detail). Da se to vyresit pres "throws Exception" (skryji konkretni typ vyjimky), ale to zase rika "Krome Error a Runtime mozna vyhodim i Exception", coz pro klienty je tak jako tak nulova informace. Mimochodem, nasel jsem clanek s Andersem Hejlsbergem, ktery pekne vystihuje nektere z mych vyhrad proti checked exceptions: http://www.artima.com/intv/handcuffs.html
Bud napisu kus boiler-plate koduAno, protoze tak das explicitne najevo, co chces udelat v pripade chyby.
Navic se mi vubec nelibi, ze by nejaka metoda z business logiky mela deklarovat, ze "throws JsonProcessingException" - kdo ma co vedet, ze tam delam neco s JSONemTakze je pro tebe pritazlivejsi predstava, ze zavolas metodu foo() ... ktera v sobe vola, bar(), baz(), qux() a quux() a libovolna z tech metod muze vyhodit cokoliv od JsonProcessingException po SpanishInquisitionException.... a libi se ti i predstava, ze ty nevis, zda nejakou takovou vyjimku kod muze vyvolat? Nebo mas kazde volani foo() v try-catch?
Pokud delam nejake API, tak v JavaDocu (pripadne v throws) popisuju, ktere relevantni vyjimky kdy vyhazuju.Okay, dejme tomu, ze jsi s tim smireny, a ze jsi smireny s tim, ze proste metoda qux() muze vyhodit vyjimku QuxException dedici z RuntimeException, a ze tuto informaci si udrzujes v dokumentaci. Rozhodnes se zmenit metodu qux() a reknes si, ze v nekterych situacich bude jeste navic vyhazovat YetAnotherQuxException. V takovem pripade jednak musis rucne dohledat vsechna volani qux(), vsechna volani techto volani, atd. abys tam opravil dokumentaci o vyhozeni nove vyjimky, ale navic se vystavujes riziku, ze to nekde prehlednes neosetris a tise si do kodu zavedes chybu.
Oka, to je fajn - v mem pripade je ale nechci osetrovat, protoze nevim co s nimi. Nechci je ale pridavat do throws meho interface, protoze tim je vystavuju (a zaroven se k nim zavazuju), i kdyz z hlediska meho kontraktu jsou spis implementacnim detailem a chtel bych, aby je klient chapal jako "neco se posralo, nemuzu pokracovat".V takovem pripade je spravne vyhodit vlastni NecoSePosraloException
Mimochodem, nasel jsem clanek s Andersem Hejlsbergem, ktery pekne vystihuje nektere z mych vyhrad proti checked exceptions: http://www.artima.com/intv/handcuffs.html
No, because in a lot of cases, people don't care. They're not going to handle any of these exceptions. There's a bottom level exception handler around their message loop.To je presne ono, ze lidi jsou hovada a neresi poradne chybove stavy, je jejich problem ne tech vyjimek. Tato argumentace mi pripomina jednoho mojeho byvaleho spoluzaka, ktery mel rocnikovy projekt obaleny jednim velkym try-catch a kdyz mu to spadlo, tak se cely program restartoval a on mohl tvrdit, ze mu aplikace prece nespadla...
Da se to vyresit pres "throws Exception" (skryji konkretni typ vyjimky),Nojo:
people do ridiculous things. For example, they decorate every method with, "throws Exception."
Takze je pro tebe pritazlivejsi predstava, ze zavolas metodu foo() ... ktera v sobe vola, bar(), baz(), qux() a quux() a libovolna z tech metod muze vyhodit cokoliv od JsonProcessingException po SpanishInquisitionException.... a libi se ti i predstava, ze ty nevis, zda nejakou takovou vyjimku kod muze vyvolat?Tohle je ale přece celá pointa výjimek, že probublávají krz funkce, aniž by s nimi musely vůbec nějak interagovat nebo aniž by o tom ty fukce vůbec věděly. To je přesně důvod, proč byly výjimky vůbec vynalezeny. Jestliže ti tohle vadí, je na zvážení, jestli jsou pro tebe vůbec výjimky přínosem (což je mimochodem naprosto validní otázka, osobně už teď nevidím výjimky jako tak skvělou věc jako dřív).
Tohle je ale přece celá pointa výjimek, že probublávají krz funkce,Toto neni pointa vyjimek, ale dusledek toho, jak jsou implementovany. Vyjimky byly navrzeny, k tomu, aby osetrovaly chybove stavy. Kdyz si vezmu jeden prvni z paperu o vyjimkach hned tam vidim: Of the conditions detected while attempting to perform some operation, exception conditions are those brought to the attention of the operation's invoker. The invoker is then permitted (or required) to respond to the condition. Jak ale ma "invoker" vedet, ze ma nejake vyjimky osetrovat, kdyz mu podle tveho idealniho reseni, muze vybublat kdekoliv cokoliv?
Jestliže ti tohle vadí, je na zvážení, jestli jsou pro tebe vůbec výjimky přínosemJak jsi prisel na to, tohle vadi? Nevim, co se mi snazis podsunout. S probublavanim vyjimek nemam nejmensi problem, ale vadi mi, kdyz se mi muze zniceho nic objevit po zavolani metody jakokoliv vyjimka! Mam-li metodu
int foo()
, vim, ze je to metoda, ktera mi vzdy vrati hodnotu typu "int". Mam-li metodu int foo() throws MyException
, vim, ze je to metoda, ktera mi vrati hodnotu typu "int" nebo, ze muze skoncit vyjimkou typu MyException a ja se podle toho muzu zachovat.
Of the conditions detected while attempting to perform some operation, exception conditions are those brought to the attention of the operation's invoker. The invoker is then permitted (or required) to respond to the condition.To je natolik obecně řečeno, že to sedí všechny možné error handling mechanismy...
Jak ale ma "invoker" vedet, ze ma nejake vyjimky osetrovat, kdyz mu podle tveho idealniho reseni, muze vybublat kdekoliv cokoliv?Invoker ošetřuje ty výjimky, které ošetřovat má - jsou pro něj relevantní. Ostatní výjimky můžou být buď výsledkem chyby (někdo někde vyhodil něco, co vyhodit neměl), s čímž invoker stejně nemůže nic dělat, nebo jsou relevantní pro jiného invokera někde výš.
ale vadi mi, kdyz se mi muze zniceho nic objevit po zavolani metody jakokoliv vyjimka!To jsem měl na mysli. Tohohle se totiž obecně s výjimkama nemůžeš zbavit, a to dokonce ani v té Javě, kde je všeobecně statickou analýzou možné zjistit hodně.
Mam-li metoduTak z vlákna výše plyne, že tohle (v Javě) není tak úplně 100% pravda. Ale to je vedlejší, z mého pohledu je problém hlavně to, že když nastane někde pod foo() potřeba přidat nebo ubrat exception, musí se upravit každá metoda mezi vznikem oné exception a bodem jejího chycení. Pro tu filosofii, že 'dobrá' návratová hodnota i chybové stavy jsou součástí definice funkce je IMHO spíš než výjimky lepší použít něco jako rustí Result. Samozřejmě vše má svoje pro a proti...int foo()
, vim, ze je to metoda, ktera mi vzdy vrati hodnotu typu "int". Mam-li metoduint foo() throws MyException
, vim, ze je to metoda, ktera mi vrati hodnotu typu "int" nebo, ze muze skoncit vyjimkou typu MyException a ja se podle toho muzu zachovat.
noexcept
).
Ale jako platforma mne Java pripada stale silnejsi ...Pár důvodů, proč by CLR mohlo být pokročilejší než JVM:
Jinak jsem se setkal s nazorem, ze type erasure vlastne neni az tak spatne, protoze umoznuje vyssi statickou verifikovatelnost kodu.Nerozumím, jak by to mělo pomoci. Kdybych ověřoval nějakou vlastnost a generika mi tam vadila, tak je přeci mohu vymazat dodatečně (možná bych pak kvůli overloadingu musel nějaké metody přejmenovat), ne?
new T()
by přece mělo být možné čistě staticky ověřit. Přijde mi, že ten komentář na SO moc nedává smysl; pokud by dané T
nemělo default constructor, tak kompilátor prostě danou instanciaci odmítne přeložit, nesnad?
Jak staticky overis, ze T ma defaultni konstruktor, kdyz nevis co je T?Jsou různé přístupy. V C++ mají templaty taková omezení, že kompilátor vždy ví, co je
T
, tj. ví i jestli má/nemá default constructor (export templates se nikdy pořádně neujaly a export keyword byl afaik vyřazen z C++11). V Javě by imho bylo možné mít template funkce s podobnými omezeními. Další možnost jsou traits, např. v jazyce Rust existuje pro tuhle situaci trait Default.
<A> List<A> flatten(List<List<A>> nestedList)
rozhodně nejde v Javě vyvodit ekvivalenci
flatten(nestedList.map(l -> l.map(any_function))) ≡ flatten(nestedList).map(any_function)Může to pokazit obyčejný
toString
. Navíc Java má reflexi, vedlejší efekty, což znemožňuje tento styl uvažování (nestačí se dívat na typ, ale musíme se dívat i na implementaci).
Nemyslím si tedy, že by výmaz generik v tomto ohledu k něčemu přispěl.