Byla vydána nová major verze 7.0 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Nově je postavena je na Debianu 13 (Trixie) a GNOME 48 (Bengaluru). Další novinky v příslušném seznamu.
Společnost Meta na dvoudenní konferenci Meta Connect 2025 představuje své novinky. První den byly představeny nové AI brýle: Ray-Ban Meta (Gen 2), sportovní Oakley Meta Vanguard a především Meta Ray-Ban Display s integrovaným displejem a EMG náramkem pro ovládání.
Po půl roce vývoje od vydání verze 48 bylo vydáno GNOME 49 s kódovým názvem Brescia (Mastodon). S přehrávačem videí Showtime místo Totemu a prohlížečem dokumentů Papers místo Evince. Podrobný přehled novinek i s náhledy v poznámkách k vydání a v novinkách pro vývojáře.
Open source softwarový stack ROCm (Wikipedie) pro vývoj AI a HPC na GPU od AMD byl vydán ve verzi 7.0.0. Přidána byla podpora AMD Instinct MI355X a MI350X.
Byla vydána nová verze 258 správce systému a služeb systemd (GitHub).
Byla vydána Java 25 / JDK 25. Nových vlastností (JEP - JDK Enhancement Proposal) je 18. Jedná se o LTS verzi.
Věra Pohlová před 26 lety: „Tyhle aféry každého jenom otravují. Já bych všechny ty internety a počítače zakázala“. Jde o odpověď na anketní otázku deníku Metro vydaného 17. září 1999 na téma zneužití údajů o sporožirových účtech klientů České spořitelny.
Byla publikována Výroční zpráva Blender Foundation za rok 2024 (pdf).
Byl vydán Mozilla Firefox 143.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Nově se Firefox při ukončování anonymního režimu zeptá, zda chcete smazat stažené soubory. Dialog pro povolení přístupu ke kameře zobrazuje náhled. Obzvláště užitečné při přepínání mezi více kamerami. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 143 bude brzy k dispozici také na Flathubu a Snapcraftu.
Byla vydána betaverze Fedora Linuxu 43 (ChangeSet), tj. poslední zastávka před vydáním finální verze, která je naplánována na úterý 21. října.
Řešení dotazu:
java.lang.Comparable
a java.util.Comparator
. Pro programování v Javě je vůbec vhodné přečíst si JavaDoc k často používaným balíkům (java.lang, java.util, java.io, java.text) a alespoň anotaci všech tříd v těchto balíkách, abyste měl přehled aspoň o tom základním, co vám runtime knihovna Javy poskytuje.
java.lang.Comparable
, najdete tam, že implementace této třídy je právě ono „přirozené řazení“ – a o tom se píše v zadání.
return jmeno.compareToIgnoreCase(jmeno2)
.
Propiska
. Lepší je použít generika, pak to za vás pohlídá kompilátor, pak ale stejně potřebujete udělat test na null
.
Za čtvrté, stav by měl být zřejmě výčtový typ (enum
).
Za páté, soustava tolika do sebe vnořených if
ů by ve vás vždy měla vyvolat podezření, že je na tom kód něco špatně. Zkusil bych třeba tohle:
if (other == null) { return -1; } assert this.nazevFirmy != null; int result = this.nazevFirmy.compareTo(other.nazevFirmy); if (result != 0) { return result; } assert this.barva != null; result = this.barva.compareTo(other.barva); if (result != 0) { return result; } assert this.barvaPisma != null; result = this.barvaPisma.compareTo(other.barvaPisma); if (result != 0) { return result; } assert this.stav != null; result = this.stav.compareTo(other.stav); return result;
int result = 0; if (this.nazevFirmy != null) { result = this.nazevFirmy.compareTo(other.nazevFirmy); } else if (other.nazevFirmy != null) { result = 1; } if (result != 0) { return result; } ...nebo kompaktněji
int result = (this.nazevFirmy != null) ? this.nazevFirmy.compareTo(other.nazevFirmy) : (other.nazevFirmy != null) ? 1 : 0;
assert
y jsou přesně podle původního kódu (který nepředpokládal null
ové hodnoty), jenom v tom původním kódu chyběly. Pokud tam prázdné hodnoty mohou být, pak je samozřejmě nutné s nimi počítat.
assert
em (a příslušně zdokumentován v JavaDocu).
assert
ů je kontrakt metody takový, že nemá žádné požadavky na vstupní parametry, a v té metodě je chyba – neošetřený případ, kdy některá z hodnot bude prázdná. Pokud někdo tuto metodu zavolá na objekt s prázdnou hodnotou, dojde k výjimce, a je to chyba programátora této metody.
Pokud se použijí assert
y (a zdokumentuje se to v JavaDocu, kompilátor zatím s assert
y pracovat neumí), je součástí kontraktu metody to, že hodnoty nejsou prázdné. Pokud někdo zavolá metodu na objekt s prázdnými hodnotami, je to chyba volajícího. Některé budoucí verze kompilátorů snad budou umět na takové chyby upozornit už v době překladu.
@Null
a @NotNull
). Ale je potřeba si uvědomit, kdy se asserty do Javy přidaly.
assert
jenom syntaktický cukr místo
if (Boolean.getBoolean("assertion.enabled") && !(expr)) { throw new AssertionError(…); }? K čemu by bylo dobré něco takového do jazyka zavádět?
v té metodě je chyba – neošetřený případ, kdy některá z hodnot bude prázdnáJenže ve Vašem případě je ten případ stejně špatně/dobře ošetřen. Buď null je platná hodnota, a pak se to může řešit extra porovnáním tak, jak jsem navrhoval. A nebo null platná hodnota není. A v případě vstupu neplatné hodnoty se vyhazuje výjimka. A je už jen na úzusu jestli vyhodíte NPE nebo jinou, akorát že kvůli NPE nemusíte psát další řádky kódu, čímžto má marginální výhodu. Pokud chcete něco dokumentovat, můžete napsat do dokumentace jednu větu: žádné z polí nesmí být null. Slabé povahy takový guard ještě můžou chtít vynutit v konstruktoru/setteru jak jsem řekl.
int
budete cpát String
, taky dostanete za běhu výjimku – ale je snaha to odchytit dřív, konkrétně tohle už v době kompilace. assert
má stejný význam, akorát současné kompilátory asserty nijak nekontrolují. Na produkčním prostředí můžete mít assert vypnutý a kód může normálně projít (ne tento konkrétně, ale jiný kód chráněný assertem).
A v případě vstupu neplatné hodnoty se vyhazuje výjimka.Jenže je podstatné, jestli programátor tu neplatnou hodnotu kontroluje, nebo jestli si dá jako podmínku, že na vstupu neplatná hodnota nesmí být, a pak už ji nekontroluje. Test s
if
em a vyhozením výjimky je první případ, assert
nebo třeba deklarace typů parametrů metody je druhý případ – programátor hodnoty na vstupu nekontroluje a předpokládá že jsou správně. A deklarovaný typ nebo assert jsou jen nápověda pro nástroje, které tuhle kontrolu udělají za programátora, který danou metodu využívá – přičemž u deklarace typu parametru tu kontrolu umí udělat už kompilátor, u assertů to udělat (zatím) neumí a je to ponecháno až na JVM.
Potíž je ale v tom, co říkáte, totiž že toto vlastnost jazyka není.Není to vlastnost současných kompilátorů, vlastnost jazyka to je od verze 1.4. Problém assertů v Javě je ten, že jsou tak obecné, že kompilátor nemůže umět vyhodnotit všechny možné případy. Ale nenulovost by umět vyhodnocovat mohl. A možná to už i nějaké nástroje na statickou kontrolu kódu dělají. Ani kompilátor od Sunu ve všem neodpovídá plně specifikaci Javy (tj. že by využíval všechny možnosti dané jazykem) – třeba takovou anotaci
@SuppressWarnings
jednapětkový kompilátor od Sunu ignoroval, přestože byla součástí runtime knihovny (a u Javy se rozdíl mezi jazykem a runtime knihovnou stírá).
Tudíž je momentálně uvedený assert ekvivalentem testu s NPE a je momentálně zbytečné ho používat.Funkčně ano, ale sémanticky to ekvivalentní není. Souhlasím s vámi, že dnes není prakticky rozdíl*) v chování aplikace když použiju
assert
nebo klasický if
a vyhození výjimky. Ale význam toho kódu je odlišný a je podle mne škoda se toho významového rozdílu zbavovat.
*) samozřejmě až na to, že s vypnutými assertions je instrukce assert
ekvivalentní prázdné instrukci, takže se ušetří provedení pár instrukcí.
Čistě syntakticky by ale bylo lepší aby guardy parametrů byly u jejich deklarace a ne někde v těle funkce.Ano, to jsem psal a zmiňoval jsem anotace, které ovšem v Javě 1.4, kde byly zavedeny asserty, nebyly.
Problém assertů v Javě je ten, že jsou tak obecné, že kompilátor nemůže umět vyhodnotit všechny možné případy.No, ano. A tudíž je to z hlediska detekce při kompilaci k ničemu. Kdyby raději vzali ten jeden případ a dotáhli ho do dokonalosti. Java má vůbec zajímavou historii pokusů a omylů.
Ano, to jsem psal a zmiňoval jsem anotace, které ovšem v Javě 1.4, kde byly zavedeny asserty, nebyly.Anotace mi přijdou jako takový úlet kde se kompenzují všechny problémy, které by se měly řešit jinde. Druhý úlet podobného rázu je pak "programování v snippetech", jak to dovolují "moderní IDE".
Ne opravdu to neni vlastnost jazyka od verze 1.4. Je presne definovano, co aserce jsouDoporučuju přečíst si ten dokument, který jste odkazoval.
rozhodne nejsou urcene ke kontrole nejakych invariantu behem prekladu.To jsem taky nikde nepsal, já jsem psal o vývoji.
Sam asercim fandim, ale napriklad vyse uvadene umisteni aserce tesne pred radek, na kterem pri poruseni aserce ihned dojde k NPE, postrada smysl. … Aserce si precte pouze programator a ten by mel tak jako tak videt, ze na pristim radku dojde k NPEPředpoklady je nutné do kódu napsat hned, když se píše – až ten jednoduchý kód na dva řádky natáhnete na deset řádků, už nikoho nenapadne
assert
tam doplňovat. Stejně tak to nikoho nenapadne v okamžiku, kdy přístup přes členskou proměnnou nahradí voláním metody a možnost vyhození NPE přestane být tak zjevná.
assert
v kódu zároveň znamená něco jako komentář „vím o tom, že tahle podmínka musí být splněna“. Takže když budu číst výše uvedený kód bez assertů, budu muset začít hledat, jestli ty hodnoty opravdu nemohou být prázdné, nebo jestli je v tom příslušném kódu chyba, nebo jestli je záměr vyhazovat NPE (a chybí to třeba v dokumentaci). Když je tam assert
napsaný, vím, že neřešení prázdných hodnot byl autorův záměr.
Takže když budu čísta
strojové zpracováníjsou dvě různé věci. A já pro lidi píšu lidsky a už jsme si ujasnili, že asserty jsou strojově momentálně na prd. A když už mluvíme o strojovém zpracování tak si dovolím ještě dvě poznámky. Za prvé proboha proč musím do JavaDocu opisovat jména parametrů (případně jejich typy), když to v zápětí píšu do deklarace. Vemte si příklad z perlovského Getopt::Euclid. Za druhé divil byste se co všechno lze relativně spolehlivě stojove zpracovat. Bylo by stokrát příjemnější kdybych mohl psát "jméno nesmí být null" do komentáře a dostal z toho varování překladače, pokud tam někde budu cpát null, než abych strkal na dvacet míst kódu nějaké kryptogramy a počítač mi je překládal do češtiny.
už jsme si ujasnili, že asserty jsou strojově momentálně na prdPokud váš kód nikdy nespouštíte. Pokud jej spouštíte například v testech, můžete spoustu porušení kontraktu odhalit už během testů. A i když se na chybu přijde až během normálního testování, pořád assert pomůže najít skutečné místo vzniku chyby (zatímco když necháte program běžet dál, může někdy spadnout až za dost dlouho, a původní příčinu pak budete dlouho hledat).
assert
pre mna okrem ineho aj indikator kvality kodu. Zatial co uplnu nepritomnost assertov nehodnotim nijako -- niektori ho proste pausalne nepuzivaju -- zriedkave pouztie assertov v zriedkavych koplikovanych castiach kodu hodnotim ako pozitivnu snahu programatora zaviest prisnejsiu kontrolu seba sameho. Ak je vsak kod prepchaty assertami, vidim to ako varovny signal, ze autor nebol schopny urobit natolko robustny dizajn, aby mu vobec sam doveroval.
Tiskni
Sdílej: