{"id":20019,"date":"2023-08-04T10:05:18","date_gmt":"2023-08-04T08:05:18","guid":{"rendered":"https:\/\/www.sigmatre.com\/?p=20019"},"modified":"2023-08-04T12:57:06","modified_gmt":"2023-08-04T10:57:06","slug":"da-java-11-a-java-17-le-novita-piu-importanti","status":"publish","type":"post","link":"https:\/\/www.sigmatre.com\/index.php\/2023\/08\/04\/da-java-11-a-java-17-le-novita-piu-importanti\/","title":{"rendered":"Da Java 11 a Java 17: le novit\u00e0 pi\u00f9 importanti"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"20019\" class=\"elementor elementor-20019\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c7281e8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c7281e8\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-11d5cd5\" data-id=\"11d5cd5\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6ff7b77 elementor-widget elementor-widget-heading\" data-id=\"6ff7b77\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Da Java 11 a Java 17: le novit\u00e0 pi\u00f9 importanti<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0beff32 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0beff32\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c2368ea\" data-id=\"c2368ea\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f7c9d5f elementor-widget elementor-widget-text-editor\" data-id=\"f7c9d5f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Di seguito presenteremo le pi\u00f9 importanti novit\u00e0 introdotte nel linguaggio a partire dalla versione 12 alla versione 17. Ovviamente questo articolo \u00e8 impostato solo su semplici esempi accompagnati da altrettanto semplici descrizioni. Per ogni argomento presentato per\u00f2, viene linkato un altro articolo di approfondimento. Inoltre verranno trattate solo le novit\u00e0 pi\u00f9 rilevanti che riguardano il linguaggio e che quindi impattano sul lavoro quotidiano dello sviluppatore. Non tratteremo le novit\u00e0 relative ad i tool, garbage collectors, librerie, migrazioni, implementazioni e deprecazioni della piattaforma Java.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p aria-level=\"4\"><b><span data-contrast=\"auto\">Switch Expressions<\/span><\/b><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:864,&quot;335559738&quot;:240,&quot;335559739&quot;:60,&quot;335559740&quot;:240,&quot;335559991&quot;:864,&quot;469777462&quot;:[4240],&quot;469777927&quot;:[0],&quot;469777928&quot;:[1]}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Dalla versione 14 il costrutto <\/span><span data-contrast=\"auto\">switch<\/span><span data-contrast=\"auto\"> \u00e8 stato rivisto per essere usato come espressione (ovvero come istruzione che ritorna un valore) e introducendo una nuova sintassi basata sull\u2019operatore freccia <\/span><span data-contrast=\"auto\">-&gt;<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Per esempio oggi possiamo scrivere codice come il seguente:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">import java.time.Month;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">&#8230;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Month month = getMonth();<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">String season = switch(month) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 case DECEMBER, JANUARY, FEBRUARY -&gt; &#8220;winter&#8221;;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 case MARCH, APRIL, MAY -&gt; &#8220;spring&#8221;;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 case JUNE, JULY, AUGUST -&gt; &#8220;summer&#8221;;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 case SEPTEMBER, OCTOBER, NOVEMBER -&gt; &#8220;autumn&#8221;;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">};<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Possiamo osservare che il costrutto ora ritorna un valore (<\/span><i><span data-contrast=\"auto\">switch<\/span><\/i><i><span data-contrast=\"auto\"> expression<\/span><\/i><span data-contrast=\"auto\">) che viene immagazzinato nella variabile <\/span><span data-contrast=\"auto\">season<\/span><span data-contrast=\"auto\">. Inoltre la sintassi per ritornare tale valore si basa sull\u2019operatore freccia il quale ci permette di poter evitare l\u2019uso della parola chiave <\/span><span data-contrast=\"auto\">break<\/span><span data-contrast=\"auto\">, e di utilizzare la controversa tecnica del fall-through.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">In realt\u00e0 ci sono tante altre cose da dire riguardo il nuovo <\/span><span data-contrast=\"auto\">switch<\/span><span data-contrast=\"auto\">. Per esempio, che la sintassi basata sull\u2019operatore freccia \u00e8 utilizzabile anche con lo switch nella versione tradizionale (il costrutto non \u00e8 un\u2019espressione e non ritorna un valore). Poi \u00e8 stata introdotta una nuova parola chiave contestuale: <\/span><span data-contrast=\"auto\">yield<\/span><span data-contrast=\"auto\">. Inoltre, grazie alla propriet\u00e0 nota come <\/span><i><span data-contrast=\"auto\">exhaustiveness<\/span><\/i><span data-contrast=\"auto\">, il compilatore \u00e8 capace di comprendere se abbiamo coperto tutti i casi. Infatti nel nostro esempio la clausola <\/span><span data-contrast=\"auto\">default<\/span> <span data-contrast=\"auto\">non<\/span><span data-contrast=\"auto\"> si deve usare.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Per tutti i dettagli potete consultare questo <\/span><a href=\"https:\/\/www.claudiodesio.com\/il-nuovo-switch-espressioni-switch\/\"><span data-contrast=\"none\">articolo d\u2019approfondimento<\/span><\/a><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p aria-level=\"4\"><b><span data-contrast=\"auto\">Text Block<\/span><\/b><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:864,&quot;335559738&quot;:240,&quot;335559739&quot;:60,&quot;335559740&quot;:240,&quot;335559991&quot;:864,&quot;469777462&quot;:[4240],&quot;469777927&quot;:[0],&quot;469777928&quot;:[1]}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Nella versione 15 \u00e8 stata ufficializzata una importante novit\u00e0 per gli sviluppatori: i <\/span><i><span data-contrast=\"auto\">text block<\/span><\/i><span data-contrast=\"auto\">. Quando abbiamo bisogno di formattare il contenuto di una stringa per favorirne la leggibilit\u00e0, siamo costretti ad utilizzare concatenazioni e caratteri di escape. Questo \u00e8 particolarmente vero quando usiamo stringhe che contengono istruzioni di altri linguaggi come JSON, XML o SQL. Per esempio, consideriamo la seguente stringa JSON:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">private final static String JSON_STRING =<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">&#8220;{\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8221;\u00a0\u00a0\u00a0 \\&#8221;id\\&#8221;:12345,\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8221;\u00a0\u00a0\u00a0 \\&#8221;nome\\&#8221;:\\&#8221;Jean\\&#8221;,\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">&#8221;\u00a0\u00a0\u00a0 \\&#8221;cognome\\&#8221;:\\&#8221;Valjean\\&#8221;,\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8221;\u00a0\u00a0\u00a0 \\&#8221;indirizzo\\&#8221;:{\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8221;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\&#8221;via\\&#8221;:\\&#8221;Rue Plumet\\&#8221;,\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8221;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\&#8221;civico\\&#8221;:7,\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8221;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\&#8221;cap\\&#8221;:75015\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8221;\u00a0\u00a0\u00a0 }\\n&#8221; +<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8220;}&#8221;;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Oggi possiamo usare i <\/span><b><i><span data-contrast=\"auto\">Text Block<\/span><\/i><\/b><span data-contrast=\"auto\"> che ci permettono di dichiarare stringhe che si estendono su pi\u00f9 righe. Quindi possiamo riscrivere la stringa precedente con la seguente sintassi:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">private final static String JSON_TEXTBLOCK = &#8220;&#8221;&#8221;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">{<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8220;id&#8221;:12345,<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8220;nome&#8221;:&#8221;Jean&#8221;,<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8220;cognome&#8221;:&#8221;Valjean&#8221;,<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 &#8220;indirizzo&#8221;:{<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;via&#8221;:&#8221;Rue Plumet&#8221;,<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;civico&#8221;:7,<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;cap&#8221;:75015<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">}&#8221;&#8221;&#8221;;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Possiamo notare che i text block sono delimitati da una sequenza di tre virgolette, il che ci permette di utilizzare al suo interno virgolette singole senza utilizzare caratteri di escape. Ma i text block sono anche delle stringhe a tutti gli effetti e quindi possiamo utilizzare tutti i metodi della classe <\/span><span data-contrast=\"auto\">String<\/span><span data-contrast=\"auto\"> (altri ne sono stati aggiunti appositamente per supportare i text block).<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Anche per quanto riguarda i text block c\u2019\u00e8 tanto da approfondire. Si possono usare nuovi caratteri di escape, parametrizzare i text block, usare best practices e cos\u00ec via.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Per tutti i dettagli potete consultare <\/span><a href=\"https:\/\/www.claudiodesio.com\/superare-java-8-text-block\/\"><span data-contrast=\"none\">questo articolo d\u2019approfondimento<\/span><\/a><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p aria-level=\"4\"><b><span data-contrast=\"auto\">Tipi Record\u00a0<\/span><\/b><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:864,&quot;335559738&quot;:240,&quot;335559739&quot;:60,&quot;335559740&quot;:240,&quot;335559991&quot;:864,&quot;469777462&quot;:[4240],&quot;469777927&quot;:[0],&quot;469777928&quot;:[1]}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">La versione 16 ha introdotto ufficialmente un nuovo tipo di Java che si va ad aggiungere alle classi, le interfacce, le enumerazioni e alle annotazioni: i <\/span><i><span data-contrast=\"auto\">record<\/span><\/i><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Con un tipo record possiamo rappresentare <\/span><i><span data-contrast=\"auto\">contenitori di dati immutabili<\/span><\/i><span data-contrast=\"auto\">, senza creare una classe appositamente. La sintassi dei record aiuta gli sviluppatori a concentrarsi sulla progettazione di tali dati, senza perdersi nei dettagli implementativi.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">La caratteristica pi\u00f9 evidente di un record \u00e8 indubbiamente la sinteticit\u00e0. Supponiamo per esempio di voler rappresentare una classe <\/span><span data-contrast=\"auto\">Quadro<\/span><span data-contrast=\"auto\"> i cui oggetti sono immutabili. Prima della comparsa dei tipi record in Java, dovevamo scrivere una classe come la seguente:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">public final class Quadro {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 private final String titolo;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 private final String autore;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 private final int prezzo;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">public Quadro(String titolo, String autore, int prezzo) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.titolo = titolo;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.autore = autore;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.prezzo = prezzo;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 public String getTitolo() {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return titolo;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">}<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 public String getAutore() {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return autore;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 public int getPrezzo() {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return prezzo;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 @Override<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 public int hashCode() {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 final int prime = 31;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">int result = 1;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">result = prime * result + ((autore == null) ? <\/span><span data-contrast=\"auto\">0 : autore.hashCode());<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 result = prime * result + prezzo;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 result = prime * result + ((titolo == null) ? 0 : titolo.hashCode());<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return result;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 @Override<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">public boolean equals(Object obj) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (this == obj)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return true;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (obj == null)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (getClass() != obj.getClass())<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">Quadro other = (Quadro) obj;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (autore == null) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">if (other.autore != null)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (!autore.equals(other.autore))<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (prezzo != other.prezzo)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">if (titolo == null) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (other.titolo != null)<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">} else if (!titolo.equals(other.titolo))<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return true;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 @Override<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 public String toString() {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return &#8220;Quadro [titolo=&#8221; + titolo + &#8220;, autore=&#8221; +\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 autore + &#8220;, prezzo=&#8221; + prezzo + &#8220;]&#8221; ;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">}<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Oggi invece possiamo semplicemente dichiarare il seguente record:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">public record Quadro(String titolo, String autore, int prezzo) { }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Infatti tale record verr\u00e0 trasformato dal compilatore in una classe come la precedente, con poche differenze: la classe generata dal compilatore estender\u00e0 la classe <\/span><span data-contrast=\"auto\">java.lang.Record<\/span><span data-contrast=\"auto\"> e i metodi getter si chiameranno esattamente come i nomi delle variabili d\u2019istanza (in questo caso <\/span><span data-contrast=\"auto\">titolo()<\/span><span data-contrast=\"auto\">, <\/span><span data-contrast=\"auto\">autore()<\/span><span data-contrast=\"auto\"> e <\/span><span data-contrast=\"auto\">prezzo()<\/span><span data-contrast=\"auto\">). Quindi con una riga di codice possiamo definire l\u2019equivalente classe immutabile generando automaticamente oltre ai metodi getter, i metodi <\/span><span data-contrast=\"auto\">toString()<\/span><span data-contrast=\"auto\">, <\/span><span data-contrast=\"auto\">equals()<\/span><span data-contrast=\"auto\">, <\/span><span data-contrast=\"auto\">hashcode()<\/span><span data-contrast=\"auto\">, il costruttore (detto <\/span><i><span data-contrast=\"auto\">costruttore canonico<\/span><\/i><span data-contrast=\"auto\">).<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Per approfondire potete riferirvi all\u2019<\/span><a href=\"https:\/\/www.claudiodesio.com\/tipi-record\/\"><span data-contrast=\"none\">articolo di approfondimento<\/span><\/a><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p aria-level=\"4\"><b><span data-contrast=\"auto\">Sealed Classes<\/span><\/b><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:864,&quot;335559738&quot;:240,&quot;335559739&quot;:60,&quot;335559740&quot;:240,&quot;335559991&quot;:864,&quot;469777462&quot;:[4240],&quot;469777927&quot;:[0],&quot;469777928&quot;:[1]}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">La versione 17 ha introdotto una nuova caratteristica nota con il nome <\/span><b><span data-contrast=\"auto\">Sealed Classes<\/span><\/b><span data-contrast=\"auto\"> (che in italiano possiamo tradurre come <\/span><i><span data-contrast=\"auto\">classi sigillate<\/span><\/i><span data-contrast=\"auto\">), ma che in realt\u00e0 riguarda anche le interfacce, e che quindi preferiamo chiamare <\/span><b><span data-contrast=\"auto\">Sealed Types<\/span><\/b><span data-contrast=\"auto\"> (ovvero <\/span><i><span data-contrast=\"auto\">tipi sigillati<\/span><\/i><span data-contrast=\"auto\">). Ora possiamo dichiarare classi ed interfacce imponendo alcuni limiti sulla loro estensione\/implementazione. Prima dell\u2019avvento di questa caratteristica, l\u2019unico controllo che avevamo sull\u2019estensibilit\u00e0, consisteva nell\u2019impedire ad una classe di essere estesa dichiarandola <\/span><span data-contrast=\"auto\">final<\/span><span data-contrast=\"auto\"> (oppure dichiarando tutti i suoi costruttori privati). Una classe dichiarata con il modificatore <\/span><span data-contrast=\"auto\">sealed<\/span><span data-contrast=\"auto\"> invece deve dichiarare anche quali sono le sue uniche sottoclassi. Questo permette maggiore controllo sull\u2019ereditariet\u00e0, aprendo la via ad altre importanti caratteristiche come il <\/span><i><span data-contrast=\"auto\">pattern matching per il costrutto <\/span><\/i><i><span data-contrast=\"auto\">switch<\/span><\/i><span data-contrast=\"auto\"> come vedremo nell\u2019ultimo paragrafo di questo articolo.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00c8 stato introdotto il modificatore <\/span><span data-contrast=\"auto\">sealed<\/span><span data-contrast=\"auto\"> che pu\u00f2 essere utilizzato solo per classi ed interfacce, e la parola chiave <\/span><span data-contrast=\"auto\">permits<\/span><span data-contrast=\"auto\"> che rappresenta una clausola per specificare le sottoclassi\/sottointerfacce. Quindi un tipo dichiarato <\/span><span data-contrast=\"auto\">sealed<\/span><span data-contrast=\"auto\"> deve specificare anche da quali classi viene esteso\/implementato, di solito specificando la clausola <\/span><span data-contrast=\"auto\">permits<\/span><span data-contrast=\"auto\">. Consideriamo per esempio la seguente gerarchia:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">public sealed abstract class DiscoOttico permits CD, DVD {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">\/\/ codice omesso<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">}<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">public final class CD extends DiscoOttico {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 \/\/ codice omesso<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">}<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">public final class DVD extends DiscoOttico {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 <\/span><span data-contrast=\"auto\">\/\/ codice omesso<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">}<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">In pratica la classe <\/span><span data-contrast=\"auto\">DiscoOttico<\/span><span data-contrast=\"auto\"> pu\u00f2 essere estesa solo dalle classi <\/span><span data-contrast=\"auto\">CD<\/span><span data-contrast=\"auto\"> e <\/span><span data-contrast=\"auto\">DVD<\/span><span data-contrast=\"auto\">. Per definire un\u2019altra sottoclasse, bisogner\u00e0 aggiungerla alla lista definita dalla clausola <\/span><span data-contrast=\"auto\">permits<\/span><span data-contrast=\"auto\">, altrimenti il codice non sar\u00e0 compilabile. Questa caratteristica incoraggia a creare gerarchie semplici e coerenti, e permette a colpo d\u2019occhio la visualizzazione delle sottoclassi leggendo la dichiarazione della superclasse. Notare che le sottoclassi di una classe <\/span><span data-contrast=\"auto\">sealed<\/span><span data-contrast=\"auto\"> devono a loro volta essere dichiarate <\/span><span data-contrast=\"auto\">final<\/span><span data-contrast=\"auto\">, <\/span><span data-contrast=\"auto\">sealed<\/span><span data-contrast=\"auto\"> oppure <\/span><span data-contrast=\"auto\">non-sealed<\/span><span data-contrast=\"auto\"> (la terza parola chiave contestuale introdotta per il supporto a questa caratteristica).\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Per approfondire potete riferirvi al relativo <\/span><a href=\"https:\/\/www.claudiodesio.com\/tipi-sealed-e-limitazione-dellereditarieta\/\"><span data-contrast=\"none\">articolo di approfondimento<\/span><\/a><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p aria-level=\"4\"><b><span data-contrast=\"auto\">Pattern matching per instanceof<\/span><\/b><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:864,&quot;335559738&quot;:240,&quot;335559739&quot;:60,&quot;335559740&quot;:240,&quot;335559991&quot;:864,&quot;469777462&quot;:[4240],&quot;469777927&quot;:[0],&quot;469777928&quot;:[1]}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Il pattern matching \u00e8 una articolata caratteristica che Java sta introducendo gradualmente nel linguaggio, che ci permette tramite un <\/span><i><span data-contrast=\"auto\">predicato<\/span><\/i><span data-contrast=\"auto\"> (test basato sul <\/span><i><span data-contrast=\"auto\">matching<\/span><\/i><span data-contrast=\"auto\"> di un operando) di ottenere una o pi\u00f9 <\/span><i><span data-contrast=\"auto\">variabili di binding<\/span><\/i><span data-contrast=\"auto\">, ovvero delle variabili il cui scope dipende dal predicato. Il pattern matching per <\/span><span data-contrast=\"auto\">instanceof<\/span><span data-contrast=\"auto\"> semplifica il tipico utilizzo di questo operatore. Per esempio, supponiamo di avere una classe <\/span><span data-contrast=\"auto\">Punto<\/span><span data-contrast=\"auto\"> che dichiara le variabili d\u2019istanza <\/span><span data-contrast=\"auto\">x<\/span><span data-contrast=\"auto\"> e <\/span><span data-contrast=\"auto\">y<\/span><span data-contrast=\"auto\">, potremmo definire il metodo <\/span><span data-contrast=\"auto\">equals<\/span><span data-contrast=\"auto\"> nel seguente modo:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">public boolean equals(Object obj) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 if (obj instanceof Punto) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 Punto other = (Punto)obj<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 return (this.x == other.x &amp;&amp;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0 this.y == other.y);<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">}<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Questo \u00e8 un pattern ben conosciuto e molto utilizzato, ma \u00e8 verboso, ripetitivo (la parola <\/span><span data-contrast=\"auto\">Punto<\/span><span data-contrast=\"auto\"> ripetuto 3 volte in 2 righe), soggetto ad errori ed il cast \u00e8 scontato.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Con il pattern matching per <\/span><span data-contrast=\"auto\">instanceof<\/span><span data-contrast=\"auto\"> possiamo riscrivere il metodo <\/span><span data-contrast=\"auto\">equals<\/span><span data-contrast=\"auto\"> in maniera meno verbosa e pi\u00f9 robusta:\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">public boolean equals(Object obj) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 if (obj instanceof Punto other) {\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 return (this.x == other.x &amp;&amp;\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0 this.y == other.y);<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0 return false;<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">}<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Possiamo notare la variabile di binding <\/span><span data-contrast=\"auto\">other<\/span><span data-contrast=\"auto\"> \u00e8 stata dichiarata subito dopo il tipo (secondo operando dell\u2019operatore <\/span><span data-contrast=\"auto\">instanceof<\/span><span data-contrast=\"auto\">). In questo modo abbiamo potuto evitare di definirla esplicitamente e di assegnare ad essa il cast del parametro <\/span><span data-contrast=\"auto\">obj<\/span><span data-contrast=\"auto\">. Notare anche che la variabile di binding <\/span><span data-contrast=\"auto\">other<\/span><span data-contrast=\"auto\"> ha uno scope limitato al blocco di codice del costrutto <\/span><span data-contrast=\"auto\">if<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Potete approfondire l\u2019argomento con l\u2019<\/span><a href=\"https:\/\/www.claudiodesio.com\/superare-java-8-pattern-matching-per-instanceof\/\"><span data-contrast=\"none\">articolo dedicato<\/span><\/a><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p aria-level=\"4\"><b><span data-contrast=\"auto\">Pattern matching per switch (Preview 17)<\/span><\/b><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559685&quot;:864,&quot;335559738&quot;:240,&quot;335559739&quot;:60,&quot;335559740&quot;:240,&quot;335559991&quot;:864,&quot;469777462&quot;:[4240],&quot;469777927&quot;:[0],&quot;469777928&quot;:[1]}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Java 17 ritocca nuovamente il costrutto <\/span><span data-contrast=\"auto\">switch<\/span><span data-contrast=\"auto\"> che era gi\u00e0 stato modificato dalla versione 14.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Con il <\/span><b><span data-contrast=\"auto\">pattern matching per <\/span><\/b><b><span data-contrast=\"auto\">switch<\/span><\/b><span data-contrast=\"auto\">, ora \u00e8 possibile passare in input ad un costrutto <\/span><span data-contrast=\"auto\">switch<\/span><span data-contrast=\"auto\"> un qualsiasi oggetto. In questo caso, le clausole <\/span><span data-contrast=\"auto\">case<\/span><span data-contrast=\"auto\"> non coincideranno con delle costanti, bens\u00ec con dei tipi che sono <\/span><i><span data-contrast=\"auto\">compatibili<\/span><\/i> <i><span data-contrast=\"auto\">gerarchicamente<\/span><\/i><span data-contrast=\"auto\"> con il tipo specificato. Il controllo per eseguire il codice relativo ad una certa clausola <\/span><span data-contrast=\"auto\">case<\/span><span data-contrast=\"auto\">, quindi non sar\u00e0 fatto verificando l\u2019uguaglianza del parametro in input allo <\/span><span data-contrast=\"auto\">switch<\/span><span data-contrast=\"auto\"> con una costante come \u00e8 di solito avviene nel costrutto <\/span><span data-contrast=\"auto\">switch<\/span><span data-contrast=\"auto\">. Invece viene sfruttato l\u2019operatore <\/span><span data-contrast=\"auto\">instanceof<\/span><span data-contrast=\"auto\">, che grazie al pattern matching definir\u00e0 anche le variabili di binding per ogni <\/span><span data-contrast=\"auto\">case<\/span><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Per esempio, considerando le classi <\/span><span data-contrast=\"auto\">DiscoOttico<\/span><span data-contrast=\"auto\">, <\/span><span data-contrast=\"auto\">CD<\/span><span data-contrast=\"auto\"> e <\/span><span data-contrast=\"auto\">DVD<\/span><span data-contrast=\"auto\"> che abbiamo definito nel paragrafo delle <\/span><span data-contrast=\"auto\">sealed<\/span><span data-contrast=\"auto\"> classes. Possiamo usare il pattern matching con il costrutto <\/span><span data-contrast=\"auto\">switch<\/span><span data-contrast=\"auto\"> con la seguente sintassi:<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">public class LettoreOttico {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 public void inserisci(DiscoOttico discoOttico) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch(discoOttico) {<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case CD cd -&gt; suonaDisco(cd);<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case DVD dvd -&gt; caricaMenu(dvd);<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 }<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">\u00a0\u00a0\u00a0 \/\/ resto del codice omesso<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">}<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">In base al tipo a cui punter\u00e0 al runtime il parametro <\/span><span data-contrast=\"auto\">discoOttico<\/span><span data-contrast=\"auto\">, il flusso di esecuzione eseguir\u00e0 il codice specificato da uno dei due <\/span><span data-contrast=\"auto\">case<\/span><span data-contrast=\"auto\">. Notare come vengano dichiarate le variabili di binding subito dopo il tipo, e come possano essere utilizzate solo all\u2019interno del relativo codice.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Notare infine che non \u00e8 necessario utilizzare la clausola <\/span><span data-contrast=\"auto\">default<\/span><span data-contrast=\"auto\"> in casi come questi. Infatti l\u2019utilizzo della classe astratta <\/span><span data-contrast=\"auto\">sealed<\/span> <span data-contrast=\"auto\">DiscoOttico<\/span><span data-contrast=\"auto\"> ci garantisce che come input questo <\/span><span data-contrast=\"auto\">switch<\/span><span data-contrast=\"auto\"> pu\u00f2 accettare solamente oggetti di tipo <\/span><span data-contrast=\"auto\">CD<\/span><span data-contrast=\"auto\"> e <\/span><span data-contrast=\"auto\">DVD<\/span><span data-contrast=\"auto\">, e che quindi non \u00e8 necessario aggiungere una clausola <\/span><span data-contrast=\"auto\">default<\/span><span data-contrast=\"auto\"> perch\u00e9 tutti casi sono gi\u00e0 stati coperti. Anche in questo caso la verbosit\u00e0 della sintassi del costrutto \u00e8 stata notevolmente ridotta, mentre \u00e8 aumentata la robustezza.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><b><span data-contrast=\"auto\">In realt\u00e0 questa caratteristica \u00e8 ancora in anteprima in Java 17 e in Java 18, e probabilmente verr\u00e0 ufficializzata solo nella versione 19. Questo significa che per compilare un\u2019applicazione che fa uso del pattern matching per <\/span><\/b><b><span data-contrast=\"auto\">switch<\/span><\/b><b><span data-contrast=\"auto\">, bisogna specificare determinati flag come descritto nell\u2019<\/span><\/b><a href=\"https:\/\/www.claudiodesio.com\/superare-java-8-caratteristiche-in-anteprima-feature-preview\/\"><b><span data-contrast=\"none\">articolo dedicato alle caratteristiche in anteprima<\/span><\/b><\/a><b><span data-contrast=\"auto\">.\u00a0<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:1440,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Anche in questo caso potete approfondire l\u2019argomento con l\u2019<\/span><a href=\"https:\/\/www.claudiodesio.com\/pattern-matching-per-switch\/\"><span data-contrast=\"none\">articolo dedicato<\/span><\/a><span data-contrast=\"auto\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p aria-level=\"4\"><b><span data-contrast=\"auto\">Conclusioni<\/span><\/b><span data-ccp-props=\"{&quot;134245418&quot;:true,&quot;201341983&quot;:0,&quot;335559685&quot;:864,&quot;335559738&quot;:240,&quot;335559739&quot;:60,&quot;335559740&quot;:240,&quot;335559991&quot;:864}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">In questo articolo abbiamo visto come Java 17 abbia introdotto diverse novit\u00e0 rispetto a Java 11, che stanno rivoluzionando il linguaggio. La direzione dello sviluppo che ha impostato Oracle, ha come obiettivi principali quelli di rendere Java meno sempre pi\u00f9 robusto, complesso, potente e meno verboso. E non \u00e8 finita qui perch\u00e9 la pianificazione \u00e8 molto lunga e guidata dalle richieste della community. Nelle prossimi mesi potremo gi\u00e0 iniziare a provare in anteprima altre interessantissime novit\u00e0 come i <\/span><i><span data-contrast=\"auto\">virtual thread<\/span><\/i><span data-contrast=\"auto\"> e la <\/span><i><span data-contrast=\"auto\">decostruzione degli oggetti<\/span><\/i><span data-contrast=\"auto\">.\u00a0<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p><p><span data-contrast=\"auto\">Insomma, il meglio deve ancora venire!<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-57d126e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"57d126e\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d0597a2\" data-id=\"d0597a2\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8646b40 elementor-position-top elementor-widget elementor-widget-image-box\" data-id=\"8646b40\" data-element_type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/www.sigmatre.com\/wp-content\/uploads\/2023\/08\/1611848768785-150x150.jpeg\" class=\"attachment-thumbnail size-thumbnail wp-image-20046\" alt=\"\" srcset=\"https:\/\/www.sigmatre.com\/wp-content\/uploads\/2023\/08\/1611848768785-150x150.jpeg 150w, https:\/\/www.sigmatre.com\/wp-content\/uploads\/2023\/08\/1611848768785-300x300.jpeg 300w, https:\/\/www.sigmatre.com\/wp-content\/uploads\/2023\/08\/1611848768785-100x100.jpeg 100w, https:\/\/www.sigmatre.com\/wp-content\/uploads\/2023\/08\/1611848768785.jpeg 440w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/><\/figure><div class=\"elementor-image-box-content\"><h3 class=\"elementor-image-box-title\"><span style=\"color: var( --e-global-color-primary ); font-family: var( --e-global-typography-primary-font-family ), Sans-serif; font-size: var(--thim-font-h3-font-size); font-weight: var( --e-global-typography-primary-font-weight );\">Claudio De Sio Cesari<\/span><\/h3><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Da Java 11 a Java 17: le novit\u00e0 pi\u00f9 importanti \u00a0 Di seguito presenteremo le pi\u00f9 importanti novit\u00e0 introdotte nel linguaggio a partire dalla versione 12 alla versione 17. Ovviamente questo articolo \u00e8 impostato solo su semplici esempi accompagnati da &hellip; <\/p>\n","protected":false},"author":1,"featured_media":20026,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"pmpro_default_level":"","footnotes":""},"categories":[16],"tags":[],"class_list":["post-20019","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","pmpro-has-access"],"_links":{"self":[{"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/posts\/20019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/comments?post=20019"}],"version-history":[{"count":9,"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/posts\/20019\/revisions"}],"predecessor-version":[{"id":20049,"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/posts\/20019\/revisions\/20049"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/media\/20026"}],"wp:attachment":[{"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/media?parent=20019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/categories?post=20019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sigmatre.com\/index.php\/wp-json\/wp\/v2\/tags?post=20019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}