Oficiálně byl vydán Android 16. Detaily na blogu a stránkách věnovaných vývojářům.
Byla vydána nová verze 14.3 svobodného unixového operačního systému FreeBSD. Podrobný přehled novinek v poznámkách k vydání.
CSIRT.CZ upozorňuje, že na základě rozhodnutí federálního soudu ve Spojených státech budou veškeré konverzace uživatelů s ChatGPT uchovávány. Včetně těch smazaných.
Ač semestr ve škole právě končí, bastlíři ze studentského klubu Silicon Hill neodpočívají a opět se jako každý měsíc hlásí s pravidelným bastlířským setkáním Virtuální Bastlírna, kde si můžete s ostatními techniky popovídat jako u piva o novinkách, o elektronice, softwaru, vědě, technice obecně, ale také o bizarních tématech, která se za poslední měsíc na internetu vyskytla.
Z novinek za zmínku stojí Maker Faire, kde Pájeníčko předvedlo … více »Na WWDC25 byl představen balíček Containerization a nástroj container pro spouštění linuxových kontejnerů na macOS. Jedná se o open source software pod licencí Apache 2.0 napsaný v programovacím jazyce Swift.
Do 16. června do 19:00 běží na Steamu přehlídka nadcházejících her Festival Steam Next | červen 2025 doplněná demoverzemi, přenosy a dalšími aktivitami. Demoverze lze hrát zdarma.
Apple na své vývojářské konferenci WWDC25 (Worldwide Developers Conference, keynote) představil řadu novinek: designový materiál Liquid Glass, iOS 26, iPadOS 26, macOS Tahoe 26, watchOS 26, visionOS 26, tvOS 26, nové funkce Apple Intelligence, …
Organizátoři konference LinuxDays 2025, jež proběhne o víkendu 4. a 5. října 2025 v Praze na FIT ČVUT, spustili přihlašování přednášek (do 31. srpna) a sběr námětů na zlepšení.
Po roce byla vydána nová stabilní verze 25.6.0 svobodného multiplatformního multimediálního přehrávače SMPlayer (Wikipedie).
DNS4EU, tj. evropská infrastruktura služeb DNS založená na vysoce federovaném a distribuovaném ochranném ekosystému, byla spuštěna v testovacím režimu [𝕏]. Na výběr je 5 možností filtrování DNS.
javac
od Sunu od verze 1.5. A je to zdokumentovaná funkce, všichni (hm, skoro všichni) o ní vědí a vědí, že release projektu se dělá jako čistý build, nikdy jako výsledek inkrementální kompilace. Inkrementální kompilace je jenom pomůcka pro zrychlení vývoje (a třeba takový elcipse kompilátor dělá i horší věci, klidně přeloží soubor se syntaktickou chybou a příslušnou metodu s chybou nahradí pouze vyhozením výjimky, kde je zpráva o tom, že tam je syntaktická chyba).
Conf c = new Conf();
, tak kompilátor předpokládá, že třída Conf bude vždy vypadat tak, jak je popsána v Conf.java a všemožné optimalizace na to nejspíš spoléhají. Kdežto když použiješ Conf c = Class.forName("Conf").newInstance();
, tak by to mělo fungovat, protože se třída hledá až v runtimeu (stejně tak by parametrem forName mohla být proměnná).
Pokud tvrdíš, že třída Conf
vypadá tak a tak a potom ji vyměníš, je to jako bys otevřel slinkovaný céčkový program v hexaeditoru a začal přepisovat části odpovídající nějakému objektu - taky radši použiješ shared object (.so).
Skrátka třídy, které se navzájem "jůzujou" je lepší považovat za "slinkované", v prvním případě používáš přímo třídu Conf
, v druhém pouze třídu java.lang.Class
, která se, předpokládám, měnit nebude.
A rada na závěr: na konfiguraci je XML.
PS: v mém projektíku si z různých důvodů nemůžu konfiguraci v XML dovolit
Tak použij -D
parametry
I tak bych to řešil properties souborem na ClassPath. Kvůli jedný blbině nemusíš zbytečně rekompilovat…
pokud nepotřebuje uživatel dynamické změnyCož pravděpodobně potřebuje, když vyměňuje .class soubory. Teď nemyslím konkrétně tenhle případ - zapínání/vypínání debugování se takhle řešit dá, ale jak už tu zaznělo, je potřeba před produkčním nasazením celý projekt přebuildovat.
Co se té třídy Conf
týče:
zpravidla jsou tyto třídy javí interfaces, takže s nimi není třeba nikterak šachovat (když jo, tak se refaktoruje na obou stranách). A jak pak vypadá ta ConfImpl
třída — to je už opravdu jedno. Jenom musí implementovat ten interface. Takhle třeba funguje vychytávka services.
Docela se mi líbí ten princip modulů v NetBeans. Každý modul je rozdělen na dvě části (pozor, zjednodušuji!): první je public API (ty interfáče) a pak pod tím — ta druhá — je private API s implementací. Pomocí ClassLoaderů je zajištěno, že jiný modul se k té druhé části nedostane. Takže já pak můžu mít několik modulů, které implementují stejné veřejné API a implementace dělá něco trošku/úplně jiného. Je to v podstatě ten model services, akorát víc dotažený.
Sranda. Zrovna včera jsem na tenhle paskvil upozornil v naší aplikaci. Konstanty obencě by neměly být
public
nebo package public
. Od toho jsou enum
y. (Pro rejpaly: neříkám, že to nejde nebo že se to nesmí. Ale zrovna debug level je učebnicová ukázka, jak se to používat nemá. )
Když není nazbyt, tak se to řeší takto:
public static final String SOMETHING; static { SOMETHING = "foo"; }
Takto se vytvoří jen vazba na třídu (aspoň současná verze javac
ten trik neumí odhalit) a inlinování provede až ClassLoader za běhu.
Doporučuji si přečíst pár článků o modulárním programování v Javě. Toto konkrétně se řešilo před pár lety, když designovali GlassFish v3. Obecně o modulárním programování pojednává Jaroslav Tulach z NetBeans.
Ale třeba o tom vím jen velký kulový. Koneckonců, v Javě jsem dělal naposledy před rokem.
Classloaderovou magii opravdu nemusím.
ClassLoadeři jsou mí nejlepší kamarádi. Ale já byl vždycky jinej. Když si vzpomenu třeba na
ResourceClassLoader
, který natahoval aplikaci z resourců přímo z Jar archivu, takže jsem nemusel řešit takový ty lib/
adresáře a -cp
parametry… Nebo můj miláček — EndorsedClassLoader
. A endorsed.dirs
šly tam, odkud přišly.
No, až na to, že to ty knihovny přebalí a cosi to udělá s třídami — tak je to cool. Ale ten ClassLoader mi připadá trošku bezpečnější.
Tiskni
Sdílej: