<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>JEP 445 na SoftwareGarden.dev</title><link>https://softwaregarden.dev/pl/tags/jep-445/</link><description>Ostatnie wpisy w JEP 445 na SoftwareGarden.dev</description><generator>Hugo -- gohugo.io</generator><language>pl_PL</language><copyright>© Piotr Przybył SoftwareGarden.dev CC BY-NC-SA 4.0</copyright><lastBuildDate>Sat, 21 Oct 2023 16:00:00 +0200</lastBuildDate><atom:link href="https://softwaregarden.dev/pl/tags/jep-445/index.xml" rel="self" type="application/rss+xml"/><item><title>JEP 445 i krótsze Java skrypty</title><link>https://softwaregarden.dev/pl/posts/new-java/scripts/shorter-scrips-jep-445/</link><pubDate>Sat, 21 Oct 2023 16:00:00 +0200</pubDate><guid>https://softwaregarden.dev/pl/posts/new-java/scripts/shorter-scrips-jep-445/</guid><description>&lt;p&gt;Poprzednio umieściłem na moim blogu dwa wpisy. Jeden dotyczył &lt;a href="https://softwaregarden.dev/pl/posts/new-java/scripts/java-scripts/"&gt;Java skryptów&lt;/a&gt;, drugi możliwości ich przenoszenia poprzez wykorzystanie &lt;a href="https://softwaregarden.dev/pl/posts/new-java/scripts/more-on-shebang/"&gt;shebang&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;O ile mogę stwierdzić, wszystko w tych dwóch częściach nadal jest aktualne, jednak teraz, w Javie 21, dzięki &lt;a href="https://openjdk.org/jeps/445"&gt;JEP-445&lt;/a&gt;, poprzednie dwa wpisy mogłyby być jeszcze bardziej zwięzłe. W tym wpisie spróbuję opisać najpierw zmiany wprowadzone przez ten JEP, a następnie zajmę się bardziej szczegółowo tym, w jaki sposób mają się do &amp;ldquo;skryptów w Javie&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Opiszę, jak można uprościć metodę &lt;code&gt;main&lt;/code&gt;, pozbyć się otaczającej jej klasy, a potem zobaczymy, kiedy to nie będzie działać.&lt;/p&gt;
&lt;h3 id="czy-metoda-main-jest-naprawdę-zbyt-rozlazła"&gt;Czy metoda &lt;code&gt;main&lt;/code&gt; jest naprawdę zbyt rozlazła?&lt;/h3&gt;
&lt;p&gt;Zacząłem programować w Javie w 2003 roku. Java nie była moim pierwszym językiem pochodzącym od C, którym się posługiwałem. Przed Javą znałem Turbo Pascal i C++, więc koncepcja &lt;code&gt;int main()&lt;/code&gt; jako punktu wejścia nie była dla mnie zupełnie nowa. Z drugiej strony byłem też dość wydajnym programistą PHP 3 (ponieważ stypendium nie wystarczało), więc również miałem styczność z koncepcją języka programowania bez &lt;code&gt;main&lt;/code&gt;. (Tak, uważam, że PHP to język programowania i zasługuje na szacunek, gdy trzeba).&lt;/p&gt;
&lt;p&gt;W rzeczywistości w tamtych czasach Java była pierwszym językiem praktycznie dla nikogo, już znaliśmy kilka języków z &lt;code&gt;main&lt;/code&gt;. Oczywiście, &lt;code&gt;String[] args&lt;/code&gt; było pewnym ceremoniałem, ale to było w porządku. To, co było nieco bardziej zagmatwane i wymagało podejścia &amp;ldquo;zaufaj mi, zrozumiesz to później&amp;rdquo;, to klasa otaczająca &lt;code&gt;main&lt;/code&gt;. Pisaliśmy zatem &lt;code&gt;class Klass&lt;/code&gt;, aby zrozumieć to później, chyba że mieliśmy już doświadczenie z obiektowym C++.&lt;/p&gt;
&lt;p&gt;Rzecz w tym, że to było 20 lat temu, kiedy Java była postrzegana jako nowinka. W dzisiejszych czasach mamy coraz więcej nowicjuszy w Javie, którzy pochodzą z języków bez &lt;code&gt;main&lt;/code&gt; lub nawet nie mają w ogóle doświadczenia w programowaniu. Dlatego bardzo cenię to, co umożliwia im &lt;a href="https://openjdk.org/jeps/445"&gt;JEP-445&lt;/a&gt;, czyli pominięcie części ceremoniału, gdy tworzą prosty program w jednym pliku, ponieważ uczą się wszystkich tych &amp;ldquo;zmiennych&amp;rdquo; i &amp;ldquo;pętli&amp;rdquo;, a być może nawet &amp;ldquo;metod&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Jeśli jnie przeszkadza ci &lt;code&gt;--enable-preview&lt;/code&gt; i nie potrzebujesz argumentów, zamiast:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PublicStaticVoidMainWithArguments&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; _ignored) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Good old public static main.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;możesz po prostu napisać:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;The new main.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Teraz, dzięki JEP-445, możemy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;W ogóle pominąć deklarację klasy,&lt;/li&gt;
&lt;li&gt;Pominąć też &lt;code&gt;String[] args&lt;/code&gt; (chyba że nadal ich potrzebujesz, wtedy nadal możesz ich używać, oczywiście),&lt;/li&gt;
&lt;li&gt;Pozbyć się &lt;code&gt;static&lt;/code&gt; z metody &lt;code&gt;main&lt;/code&gt;, więc może to być metoda instancyjna,&lt;/li&gt;
&lt;li&gt;W rzeczywistości możesz użyć dowolnego modyfikatora dostępu, włącznie z domyślnym (tak jak wyżej), z wyjątkiem &lt;code&gt;private&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="priorytet-metod-main"&gt;Priorytet metod &lt;code&gt;main&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&amp;ldquo;No dobra&amp;rdquo; możesz zapytać, &amp;ldquo;w Javie mogę przeładowywać metody. Co się stanie, jeśli mam &lt;code&gt;public static void main(String args[])&lt;/code&gt; i &lt;code&gt;void main()&lt;/code&gt;?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Cóż, nie martw się. Jeśli kod się kompiluje i masz dwie metody &lt;code&gt;main&lt;/code&gt;, tylko jedna zostanie wywołana, a priorytet jest ściśle określony.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Najpierw metoda z &lt;code&gt;String[] args&lt;/code&gt; ma pierwszeństwo przed metodą bez &lt;code&gt;args&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Następnie &lt;code&gt;static&lt;/code&gt; jest preferowane nad instancyjnym.&lt;/li&gt;
&lt;li&gt;Na koniec, im bardziej &amp;ldquo;public&amp;rdquo;, tym wyżej jest na liście.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Przy okazji, zastanawiam się, czy to naprawdę sensowne podejście, aby mieć taką łamigłówkę z więcej niż jedną metodą &lt;code&gt;main&lt;/code&gt; w swoim pliku (lub klasie). Nie rób tego sobie i ludziom wokół siebie. ;-)&lt;/p&gt;
&lt;h3 id="czy-to-podejście-bez-klasy"&gt;Czy to podejście bez klasy?&lt;/h3&gt;
&lt;p&gt;Niekoniecznie. Klasa nadal istnieje. Jest to tzw. klasa nienazwana (ang. &lt;em&gt;unnamed class&lt;/em&gt;), generowana dla nas automatycznie pod spodem.&lt;/p&gt;
&lt;p&gt;Nie musisz mi wierzyć, możesz zaufać kodowi. Spróbuj umieścić poniższy kod w pliku o rozszerzeniu &lt;code&gt;.java&lt;/code&gt; i uruchom go:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;New instance main in unnamed class, without arg(s).&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Is the class unnamed? &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getClass&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;isUnnamedClass&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;The class name is &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getClass&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;...?&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;And the modifiers are [&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; java.&lt;span style="color:#a6e22e"&gt;lang&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;reflect&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Modifier&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getClass&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;getModifiers&lt;/span&gt;())&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;]&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.&lt;span style="color:#a6e22e"&gt;out&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;println&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;(The package name is [&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getClass&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;getPackage&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;getName&lt;/span&gt;()&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;])&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Jeśli się zastanawiasz, jak uruchomić ten kod (np. dlatego, że Twoje IDE nie pokazuje Ci tego ładnego zielonego przycisku &amp;ldquo;Uruchom&amp;rdquo;), zawsze możesz uruchomić to tak, jak umożliwia JEP-330:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ java --source 21 --enable-preview nazwaTwojegoPliku.java&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Zobaczysz, że klasa jest &lt;code&gt;final&lt;/code&gt;, znajduje się w domyślnym (&amp;ldquo;nienazwanym&amp;rdquo;) pakiecie, teraz możesz sprawdzić, czy jest &amp;ldquo;unnamed class&amp;rdquo; (nienazwana) oraz że&amp;hellip; ma nazwę! Jej nazwa pochodzi od nazwy pliku. Zabawne jest to, że klasa faktycznie ma nazwę, pochodzącą od nazwy pliku&amp;hellip; To jest taki &amp;ldquo;szczegół implementacyjny&amp;rdquo;&amp;hellip;&lt;/p&gt;
&lt;p&gt;Dlatego, jeśli nadałeś swojemu plikowi na przykład nazwę &lt;code&gt;nazwa-twojego-pliku.java&lt;/code&gt;, zobaczysz błąd. Znowu, nie musisz mi wierzyć, uruchom i baw się dobrze ;-)&lt;/p&gt;
&lt;p&gt;Jeśli z jakiegoś powodu nie możesz tego zrobić, wygląda to mniej więcej tak:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;your-file-name.java:44: error: bad file name: your-file-name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; void main() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ^&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Aktualnie nazwa pliku nie może być po prostu &lt;em&gt;dowolną&lt;/em&gt; nazwą, nadal musi być poprawną nazwą klasy, jeśli nazwa pliku kończy się na &lt;code&gt;.java&lt;/code&gt;. (Albo musisz go umieścić w klasie o modyfikatorze dostępu niepublicznym). Nie jestem pewien, czy to szczęśliwy zbieg okoliczności, bo ma to pewne konsekwencje.&lt;/p&gt;
&lt;h3 id="konsekwencja-brak-skryptów-bez-klasy"&gt;Konsekwencja: brak skryptów bez klasy&lt;/h3&gt;
&lt;p&gt;Po JEP-330 byliśmy w stanie pisać &amp;ldquo;skrypty w Javie&amp;rdquo; za pomocą &lt;code&gt;#!shebang&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Może nas teraz korcić, żeby umieścić powyższą metodę &lt;code&gt;main&lt;/code&gt; w pliku np. o nazwie &lt;code&gt;java.script&lt;/code&gt; i dodać na początku linię:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env -S java --enable-preview --source 21&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tylko&amp;hellip; to nie działa. Mechanizm przekształcania nazwy pliku na nazwę klasy ma zastosowanie tylko wtedy, gdy uruchamiamy &lt;code&gt;java --source effectivelyAKlass.java&lt;/code&gt;. Jeśli używamy shebang, to nie zadziała. Znowu, z powodu błędu &amp;ldquo;bad file name&amp;rdquo;. Musimy umieścić &amp;ldquo;uproszczoną&amp;rdquo; metodę &lt;code&gt;main&lt;/code&gt; w klasie, więc wygląda to na przykład tak:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#!/usr/bin/env -S java --enable-preview --source 21
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// In GNU/Linux the -S can be used since env version 8.30
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// for other OSes and older env versions you may need to use absolute shebang
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;class KlasaPosiadająca {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; void main() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.out.println(&amp;#34;This is Java Script! 👿&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.out.println(&amp;#34;Hello from &amp;#34;+ Runtime.version());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.out.println(&amp;#34;New instance main in unnamed class, without arg(s).&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.out.println(&amp;#34;Is the class unnamed? &amp;#34; + this.getClass().isUnnamedClass());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.out.println(&amp;#34;The class name is &amp;#34; + this.getClass().getName() + &amp;#34;...?&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.out.println(&amp;#34;And the modifiers are [&amp;#34; + java.lang.reflect.Modifier.toString(this.getClass().getModifiers())+&amp;#34;]&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.out.println(&amp;#34;(The package name is [&amp;#34; +this.getClass().getPackage().getName()+&amp;#34;])&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I nie bardzo możemy się pozbyć tej klasy posiadającej, jeśli ten skrypt ma działać&amp;hellip;&lt;/p&gt;
&lt;h3 id="czy-podoba-mi-się-ten-aspekt-jep-445"&gt;Czy podoba mi się ten aspekt JEP-445?&lt;/h3&gt;
&lt;p&gt;Szczerze mówiąc, nie jestem pewien, czy podoba mi się ten &amp;ldquo;szczegół implementacyjny&amp;rdquo;, który w rzeczywistości zmusza nas do nadawania odpowiednich nazw plikom &lt;code&gt;.java&lt;/code&gt; lub deklarowania w skryptach shebang &lt;code&gt;class Klass&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Oczywiście zdaję sobie sprawę, że to jest wyjątkowo rzadki przypadek, brzeg brzegów, przydatny głównie dla koneserów rozmów rekrutacyjnych (kiedy odwracanie drzew binarnych już nie wystarcza). I może się okazać, że umykają mi poważne argumenty, które czynią to podejście najlepszym&amp;hellip;&lt;/p&gt;
&lt;p&gt;Mimo to może ten &amp;ldquo;szczegół implementacyjny&amp;rdquo; jest zbyt restrykcyjny? Może automatycznie generowana klasa mogłaby mieć pustą nazwę &amp;quot;&amp;quot; tak jak pakiet domyślny, jeśli to nie wymagałoby zbyt dużych zmian w JVMie? A jeśli to byłby zbyt duży krok, to może przynajmniej mogłaby mieć całkowicie losową nazwę? Albo może chęć poznania nazwy klasy nienazwanej powinna rzucać wyjątek, tak jak &lt;code&gt;addFirst(...)&lt;/code&gt; w kolekcjach niezmiennych? (Chociaż naprawdę nie jestem pewien, czy to byłby dobry pomysł).&lt;/p&gt;
&lt;p&gt;Obawiam się nieco, że ten szczegół implementacyjny nie tylko może być zbyt restrykcyjny, ale niektórzy ludzie mogą go nadużywać, nawet jeśli dokumentacja mówi, że nie należy używać nazwy UnnamedClass. (Obiło ci się o uszy &lt;code&gt;sun.misc.Unsafe&lt;/code&gt;? ;-))&lt;/p&gt;
&lt;p&gt;Przyszłość pokaże.&lt;/p&gt;
&lt;h3 id="i-tak-jest-dużo-lepiej"&gt;I tak jest dużo lepiej&lt;/h3&gt;
&lt;figure class="image image right"&gt;
&lt;img src="old-book.png" alt="Stary skrypt" width="440"&gt;
&lt;/figure&gt;
&lt;p&gt;Co prawda, jeśli chcemy napisać &amp;ldquo;porządny skrypt w Javie&amp;rdquo;, nadal musimy korzystać z klasy albo mieć właściwą nazwę pliku, ale i tak jest lepiej. Przynajmniej dużo łatwiej teraz zacząć przygodę z Javą.&lt;/p&gt;
&lt;p&gt;Nie mam jakichś szczególnie dużych złudzeń, że takie skrypty będą popularne na produkcji w czasach obrazów natywnych. Ale do nauki powinny być w sam raz, bo nie trzeba od razu rozumieć wszystkiego (albo brać na wiarę) i do tego męczyć się z &lt;code&gt;javac&lt;/code&gt; i &lt;code&gt;java&lt;/code&gt;. &lt;br&gt;
A to jeszcze nie jest ostatnie słowo w skryptach Javy, dlatego że jest propozycja kolejnego &lt;a href="https://openjdk.org/jeps/458"&gt;JEPa-458&lt;/a&gt;!&lt;/p&gt;</description></item></channel></rss>