diff --git a/html-generators/locales.properties b/html-generators/locales.properties index 1013c65..c3d80ce 100644 --- a/html-generators/locales.properties +++ b/html-generators/locales.properties @@ -8,3 +8,4 @@ ar=🇸🇦 العربية fr=🇫🇷 Français ja=🇯🇵 日本語 ko=🇰🇷 한국어 +it=🇮🇹 Italiano diff --git a/translations/content/it/collections/collectors-teeing.yaml b/translations/content/it/collections/collectors-teeing.yaml new file mode 100644 index 0000000..d042758 --- /dev/null +++ b/translations/content/it/collections/collectors-teeing.yaml @@ -0,0 +1,18 @@ +--- +title: Collectors.teeing() +oldApproach: Due passaggi +modernApproach: teeing() +summary: "Calcola due aggregazioni in un unico passaggio dello stream." +explanation: "Collectors.teeing() invia ogni elemento a due collector downstream e unisce i risultati. Evita di scorrere i dati due volte o di usare un accumulatore mutabile." +whyModernWins: +- icon: ⚡ + title: Passaggio singolo + desc: "Elabora lo stream una volta invece di due." +- icon: 🧩 + title: Componibile + desc: "Combina qualsiasi due collector con una funzione di unione." +- icon: 🔒 + title: Risultato immutabile + desc: "Unisci direttamente in un record o value object." +support: + description: Ampiamente disponibile dal JDK 12 (marzo 2019) diff --git a/translations/content/it/collections/copying-collections-immutably.yaml b/translations/content/it/collections/copying-collections-immutably.yaml new file mode 100644 index 0000000..46eb60a --- /dev/null +++ b/translations/content/it/collections/copying-collections-immutably.yaml @@ -0,0 +1,18 @@ +--- +title: Copia di collezioni in modo immutabile +oldApproach: Copia manuale + Wrap +modernApproach: List.copyOf() +summary: "Crea una copia immutabile di qualsiasi collezione in una chiamata." +explanation: "List.copyOf(), Set.copyOf() e Map.copyOf() creano snapshot immutabili di collezioni esistenti. Se la sorgente è già una collezione immutabile, non viene effettuata alcuna copia." +whyModernWins: +- icon: ⚡ + title: Copia intelligente + desc: "Salta la copia se la sorgente è già immutabile." +- icon: 📏 + title: Una chiamata + desc: "Nessuna costruzione manuale di ArrayList + wrapping." +- icon: 🛡️ + title: Copia difensiva + desc: "Le modifiche all'originale non influenzano la copia." +support: + description: Ampiamente disponibile dal JDK 10 (marzo 2018) diff --git a/translations/content/it/collections/immutable-list-creation.yaml b/translations/content/it/collections/immutable-list-creation.yaml new file mode 100644 index 0000000..5924cc4 --- /dev/null +++ b/translations/content/it/collections/immutable-list-creation.yaml @@ -0,0 +1,18 @@ +--- +title: Creazione di liste immutabili +oldApproach: Wrapping verboso +modernApproach: List.of() +summary: "Crea liste immutabili in un'unica espressione pulita." +explanation: "List.of() crea una lista veramente immutabile — nessun wrapping, nessuna copia difensiva. È ostile ai null (rifiuta elementi null) e strutturalmente immutabile. Il vecchio modo richiedeva tre chiamate annidate." +whyModernWins: +- icon: 📏 + title: Una chiamata + desc: "Sostituisci tre chiamate annidate con un singolo metodo factory." +- icon: 🔒 + title: Veramente immutabile + desc: "Non è solo un wrapper — la lista stessa è immutabile." +- icon: 🛡️ + title: Null-safe + desc: "Rifiuta gli elementi null al momento della creazione, fallendo rapidamente." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/collections/immutable-map-creation.yaml b/translations/content/it/collections/immutable-map-creation.yaml new file mode 100644 index 0000000..f1be400 --- /dev/null +++ b/translations/content/it/collections/immutable-map-creation.yaml @@ -0,0 +1,18 @@ +--- +title: Creazione di mappe immutabili +oldApproach: Pattern Builder per Map +modernApproach: Map.of() +summary: "Crea mappe immutabili inline senza un builder." +explanation: "Map.of() accetta coppie chiave-valore inline e restituisce una mappa immutabile. Per più di 10 voci, usa Map.ofEntries() con coppie Map.entry()." +whyModernWins: +- icon: 📏 + title: Creazione inline + desc: "Non serve una mappa mutabile temporanea." +- icon: 🔒 + title: Risultato immutabile + desc: "La mappa non può essere modificata dopo la creazione." +- icon: 🚫 + title: Nessuna chiave/valore null + desc: "Le voci null vengono rifiutate immediatamente." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/collections/immutable-set-creation.yaml b/translations/content/it/collections/immutable-set-creation.yaml new file mode 100644 index 0000000..45d4187 --- /dev/null +++ b/translations/content/it/collections/immutable-set-creation.yaml @@ -0,0 +1,18 @@ +--- +title: Creazione di set immutabili +oldApproach: Wrapping verboso +modernApproach: Set.of() +summary: "Crea set immutabili con una singola chiamata factory." +explanation: "Set.of() crea un set veramente immutabile che rifiuta null e elementi duplicati al momento della creazione. Niente più wrapping di set mutabili." +whyModernWins: +- icon: 📏 + title: Conciso + desc: "Una riga invece di tre chiamate annidate." +- icon: 🚫 + title: Rileva duplicati + desc: "Lancia un'eccezione se passi accidentalmente elementi duplicati." +- icon: 🔒 + title: Immutabile + desc: "Nessuna aggiunta/rimozione possibile dopo la creazione." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/collections/map-entry-factory.yaml b/translations/content/it/collections/map-entry-factory.yaml new file mode 100644 index 0000000..780b375 --- /dev/null +++ b/translations/content/it/collections/map-entry-factory.yaml @@ -0,0 +1,18 @@ +--- +title: Factory Map.entry() +oldApproach: SimpleEntry +modernApproach: Map.entry() +summary: "Crea voci di mappa con un metodo factory pulito." +explanation: "Map.entry() sostituisce il verboso costruttore AbstractMap.SimpleEntry. Restituisce una voce immutabile, rendendola ideale per Map.ofEntries() e le operazioni stream." +whyModernWins: +- icon: 📏 + title: Conciso + desc: "Una riga invece di tre con un'intenzione più chiara." +- icon: 🔒 + title: Immutabile + desc: "La voce restituita non può essere modificata." +- icon: 🧩 + title: Componibile + desc: "Funziona perfettamente con Map.ofEntries() per mappe grandi." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/collections/reverse-list-iteration.yaml b/translations/content/it/collections/reverse-list-iteration.yaml new file mode 100644 index 0000000..6aae18b --- /dev/null +++ b/translations/content/it/collections/reverse-list-iteration.yaml @@ -0,0 +1,18 @@ +--- +title: Iterazione inversa di lista +oldApproach: ListIterator manuale +modernApproach: reversed() +summary: "Itera su una lista in ordine inverso con un ciclo for-each pulito." +explanation: "Il metodo reversed() di SequencedCollection restituisce una vista ordinata in senso inverso della lista. Questa vista è supportata dalla lista originale, quindi non si verifica alcuna copia. La sintassi del ciclo for potenziato rende l'iterazione inversa leggibile quanto quella diretta." +whyModernWins: +- icon: 📖 + title: Sintassi naturale + desc: "Ciclo for potenziato invece del verboso ListIterator." +- icon: ⚡ + title: Nessuna copia + desc: "reversed() restituisce una vista — nessun overhead di prestazioni." +- icon: 🧩 + title: API coerente + desc: "Funziona su List, Deque, SortedSet in modo uniforme." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/collections/sequenced-collections.yaml b/translations/content/it/collections/sequenced-collections.yaml new file mode 100644 index 0000000..486b78e --- /dev/null +++ b/translations/content/it/collections/sequenced-collections.yaml @@ -0,0 +1,18 @@ +--- +title: Collezioni sequenziate +oldApproach: Aritmetica degli indici +modernApproach: getFirst/getLast +summary: "Accedi ai primi/ultimi elementi e alle viste inverse con metodi API puliti." +explanation: "SequencedCollection aggiunge getFirst(), getLast(), reversed(), addFirst(), addLast() a List, Deque, SortedSet e LinkedHashSet. Niente più aritmetica size-1 o iterazione inversa manuale." +whyModernWins: +- icon: 📖 + title: Auto-documentante + desc: "getLast() è più chiaro di get(size()-1)." +- icon: 🔄 + title: Vista invertita + desc: "reversed() fornisce una vista — nessuna copia necessaria." +- icon: 🧩 + title: API uniforme + desc: "Funziona allo stesso modo su List, Deque, SortedSet." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/collections/stream-toarray-typed.yaml b/translations/content/it/collections/stream-toarray-typed.yaml new file mode 100644 index 0000000..cdbff94 --- /dev/null +++ b/translations/content/it/collections/stream-toarray-typed.yaml @@ -0,0 +1,18 @@ +--- +title: Stream toArray tipizzato +oldApproach: Copia manuale dell'array +modernApproach: toArray(generatore) +summary: "Converti gli stream in array tipizzati con un riferimento a metodo." +explanation: "Il metodo toArray(IntFunction) crea un array correttamente tipizzato da uno stream. Il generatore (String[]::new) indica allo stream quale tipo di array creare." +whyModernWins: +- icon: 🎯 + title: Type-safe + desc: "Nessun cast a Object[] — il tipo dell'array è corretto." +- icon: 🔗 + title: Concatenabile + desc: "Funziona alla fine di qualsiasi pipeline stream." +- icon: 📏 + title: Conciso + desc: "Un'espressione sostituisce il loop manuale." +support: + description: Ampiamente disponibile dal JDK 8 (marzo 2014) diff --git a/translations/content/it/collections/unmodifiable-collectors.yaml b/translations/content/it/collections/unmodifiable-collectors.yaml new file mode 100644 index 0000000..0fd0a49 --- /dev/null +++ b/translations/content/it/collections/unmodifiable-collectors.yaml @@ -0,0 +1,18 @@ +--- +title: Collector non modificabili +oldApproach: collectingAndThen +modernApproach: stream.toList() +summary: "Raccogli direttamente in una lista non modificabile con stream.toList()." +explanation: "Java 10 ha aggiunto toUnmodifiableList(), toUnmodifiableSet() e toUnmodifiableMap() per sostituire il verboso wrapper collectingAndThen. Per le liste in particolare, stream.toList() di Java 16 fornisce un'alternativa ancora più semplice — nessuna chiamata a collect(). Usa toUnmodifiableSet() e toUnmodifiableMap() per altri tipi di collezione." +whyModernWins: +- icon: 📏 + title: Il più breve + desc: "stream.toList() non necessita di collect() né dell'importazione di Collectors." +- icon: 🔒 + title: Immutabile + desc: "Il risultato non può essere modificato — nessuna mutazione accidentale." +- icon: 📖 + title: Leggibile + desc: "Si legge naturalmente come passo terminale di qualsiasi pipeline stream." +support: + description: Ampiamente disponibile dal JDK 16 (marzo 2021) diff --git a/translations/content/it/concurrency/completablefuture-chaining.yaml b/translations/content/it/concurrency/completablefuture-chaining.yaml new file mode 100644 index 0000000..fdea0a2 --- /dev/null +++ b/translations/content/it/concurrency/completablefuture-chaining.yaml @@ -0,0 +1,18 @@ +--- +title: Concatenazione CompletableFuture +oldApproach: Future.get() bloccante +modernApproach: CompletableFuture +summary: "Concatena operazioni asincrone senza bloccare, usando CompletableFuture." +explanation: "CompletableFuture abilita pipeline asincrone non bloccanti. Concatena le operazioni con thenApply, thenCompose, thenAccept. Gestisci gli errori con exceptionally(). Combina più future con allOf/anyOf." +whyModernWins: +- icon: 🔗 + title: Concatenabile + desc: "Componi i passi asincroni in una pipeline leggibile." +- icon: 🚫 + title: Non bloccante + desc: "Nessun thread rimane inattivo ad aspettare i risultati." +- icon: 🛡️ + title: Gestione degli errori + desc: "exceptionally() e handle() per un recupero pulito degli errori." +support: + description: Ampiamente disponibile dal JDK 8 (marzo 2014) diff --git a/translations/content/it/concurrency/concurrent-http-virtual.yaml b/translations/content/it/concurrency/concurrent-http-virtual.yaml new file mode 100644 index 0000000..e2bc8af --- /dev/null +++ b/translations/content/it/concurrency/concurrent-http-virtual.yaml @@ -0,0 +1,18 @@ +--- +title: HTTP concorrente con thread virtuali +oldApproach: Pool di thread + URLConnection +modernApproach: Thread virtuali + HttpClient +summary: "Recupera molti URL in modo concorrente con thread virtuali e HttpClient." +explanation: "I thread virtuali rendono pratico creare un thread per richiesta HTTP. Combinati con HttpClient, questo sostituisce i complessi pattern di callback asincroni con semplice codice bloccante che scala." +whyModernWins: +- icon: ♾️ + title: Thread per richiesta + desc: "Nessun dimensionamento del pool — un thread virtuale per URL." +- icon: 📖 + title: Codice semplice + desc: "Scrivi codice bloccante semplice." +- icon: ⚡ + title: Alta produttività + desc: "Migliaia di richieste concorrenti con risorse minime." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/concurrency/executor-try-with-resources.yaml b/translations/content/it/concurrency/executor-try-with-resources.yaml new file mode 100644 index 0000000..15d04b0 --- /dev/null +++ b/translations/content/it/concurrency/executor-try-with-resources.yaml @@ -0,0 +1,18 @@ +--- +title: Chiusura automatica ExecutorService +oldApproach: Shutdown manuale +modernApproach: try-with-resources +summary: "Usa try-with-resources per lo shutdown automatico dell'executor." +explanation: "Da Java 19, ExecutorService implementa AutoCloseable. Il metodo close() chiama shutdown() e attende il completamento dei task. Niente più pattern try/finally per lo shutdown manuale." +whyModernWins: +- icon: 🧹 + title: Pulizia automatica + desc: "Lo shutdown avviene automaticamente quando il blocco termina." +- icon: 🛡️ + title: Nessuna perdita + desc: "L'executor si spegne sempre, anche se si verificano eccezioni." +- icon: 📖 + title: Pattern familiare + desc: "Stesso try-with-resources usato per file, connessioni, ecc." +support: + description: Ampiamente disponibile dal JDK 19 (settembre 2022) diff --git a/translations/content/it/concurrency/lock-free-lazy-init.yaml b/translations/content/it/concurrency/lock-free-lazy-init.yaml new file mode 100644 index 0000000..dacfaa4 --- /dev/null +++ b/translations/content/it/concurrency/lock-free-lazy-init.yaml @@ -0,0 +1,18 @@ +--- +title: Inizializzazione lazy senza lock +oldApproach: synchronized + volatile +modernApproach: StableValue +summary: "Sostituisci il double-checked locking con StableValue per singleton lazy." +explanation: "StableValue incapsula il pattern di inizializzazione lazy con la corretta thread safety. La JVM può ottimizzare il percorso di lettura dopo l'inizializzazione, rendendolo potenzialmente più veloce delle letture volatile." +whyModernWins: +- icon: 🧹 + title: Nessun boilerplate + desc: "Nessun volatile, synchronized o doppio controllo null." +- icon: ⚡ + title: Letture più veloci + desc: "La JVM può piegare le costanti dopo l'inizializzazione." +- icon: ✅ + title: Provabilmente corretto + desc: "Nessun bug di ordinamento sottile — la JVM lo gestisce." +support: + description: "Anteprima nel JDK 25 (JEP 502, StableValue). Richiede --enable-preview." diff --git a/translations/content/it/concurrency/process-api.yaml b/translations/content/it/concurrency/process-api.yaml new file mode 100644 index 0000000..2d66080 --- /dev/null +++ b/translations/content/it/concurrency/process-api.yaml @@ -0,0 +1,18 @@ +--- +title: API Process moderna +oldApproach: Runtime.exec() +modernApproach: ProcessHandle +summary: "Ispeziona e gestisci i processi OS con ProcessHandle." +explanation: "ProcessHandle fornisce PID, informazioni sul processo (comando, argomenti, tempo di avvio, utilizzo CPU), relazioni padre/figlio e distruzione del processo. Niente più accesso agli interni non documentati di Process." +whyModernWins: +- icon: 🔍 + title: Informazioni complete + desc: "Accedi a PID, comando, argomenti, tempo di avvio, utilizzo CPU." +- icon: 🌳 + title: Albero dei processi + desc: "Naviga tra padre, figli e discendenti." +- icon: 📊 + title: Monitoraggio + desc: "onExit() restituisce un CompletableFuture per il monitoraggio asincrono." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/concurrency/scoped-values.yaml b/translations/content/it/concurrency/scoped-values.yaml new file mode 100644 index 0000000..ece96f8 --- /dev/null +++ b/translations/content/it/concurrency/scoped-values.yaml @@ -0,0 +1,18 @@ +--- +title: Valori scoped +oldApproach: ThreadLocal +modernApproach: ScopedValue +summary: "Condividi dati attraverso gli stack di chiamate in modo sicuro senza le insidie di ThreadLocal." +explanation: "ScopedValue fornisce contesto immutabile, ereditabile e limitato allo scope. A differenza di ThreadLocal, i valori scoped vengono puliti automaticamente, funzionano con i thread virtuali e non possono essere mutati dai chiamati." +whyModernWins: +- icon: 🔒 + title: Immutabile + desc: "I chiamati possono leggere ma non modificare mai il valore scoped." +- icon: 🧹 + title: Pulizia automatica + desc: "Nessun remove() manuale — il valore è scoped al blocco." +- icon: ⚡ + title: Sicuro per thread virtuali + desc: "Funziona efficientemente con milioni di thread virtuali." +support: + description: "Finalizzato nel JDK 25 LTS (JEP 506, settembre 2025)." diff --git a/translations/content/it/concurrency/stable-values.yaml b/translations/content/it/concurrency/stable-values.yaml new file mode 100644 index 0000000..9884d4d --- /dev/null +++ b/translations/content/it/concurrency/stable-values.yaml @@ -0,0 +1,18 @@ +--- +title: Valori stabili +oldApproach: Double-checked locking +modernApproach: StableValue +summary: "Inizializzazione lazy thread-safe senza volatile o synchronized." +explanation: "StableValue fornisce un valore inizializzato in modo lazy e immutabile con thread safety integrata. Nessun double-checked locking, nessun campo volatile, nessun blocco synchronized. La JVM può persino ottimizzare il percorso di lettura dopo l'inizializzazione." +whyModernWins: +- icon: 🧹 + title: Zero boilerplate + desc: "Nessun volatile, synchronized o controlli null." +- icon: ⚡ + title: Ottimizzato dalla JVM + desc: "La JVM può piegare il valore dopo l'inizializzazione." +- icon: 🛡️ + title: Garantito una volta + desc: "Il supplier viene eseguito esattamente una volta, anche sotto contesa." +support: + description: "Anteprima nel JDK 25 (JEP 502). Richiede --enable-preview." diff --git a/translations/content/it/concurrency/structured-concurrency.yaml b/translations/content/it/concurrency/structured-concurrency.yaml new file mode 100644 index 0000000..48c3c1d --- /dev/null +++ b/translations/content/it/concurrency/structured-concurrency.yaml @@ -0,0 +1,18 @@ +--- +title: Concorrenza strutturata +oldApproach: Ciclo di vita del thread manuale +modernApproach: StructuredTaskScope +summary: "Gestisci i cicli di vita dei task concorrenti come un'unica unità di lavoro." +explanation: "La concorrenza strutturata tratta un gruppo di task concorrenti come un'unica operazione. Se un subtask fallisce, gli altri vengono annullati. Lo scope garantisce che non ci siano perdite di thread e fornisce chiare relazioni padre-figlio." +whyModernWins: +- icon: 🛡️ + title: Nessuna perdita di thread + desc: "Tutti i task biforcati completano prima che lo scope si chiuda." +- icon: ⚡ + title: Fallimento rapido + desc: "ShutdownOnFailure annulla i fratelli se uno fallisce." +- icon: 📐 + title: Struttura chiara + desc: "Il ciclo di vita del task corrisponde allo scope lessicale nel codice." +support: + description: "Anteprima nel JDK 25 (quinta anteprima, JEP 505). Richiede --enable-preview." diff --git a/translations/content/it/concurrency/thread-sleep-duration.yaml b/translations/content/it/concurrency/thread-sleep-duration.yaml new file mode 100644 index 0000000..c9e5d26 --- /dev/null +++ b/translations/content/it/concurrency/thread-sleep-duration.yaml @@ -0,0 +1,18 @@ +--- +title: Thread.sleep con Duration +oldApproach: Millisecondi +modernApproach: Duration +summary: "Usa Duration per valori di tempo auto-documentanti." +explanation: "Thread.sleep(Duration) rende l'unità di tempo esplicita. Non serve più indovinare se 5000 significa millisecondi o microsecondi. Funziona con Duration.ofSeconds, ofMillis, ofMinutes, ecc." +whyModernWins: +- icon: 📖 + title: Auto-documentante + desc: "Duration.ofSeconds(5) è inequivocabile." +- icon: 🛡️ + title: Sicuro per unità + desc: "Nessun rischio di passare accidentalmente microsecondi come millisecondi." +- icon: 🧩 + title: Componibile + desc: "Aritmetica Duration: plus(), multipliedBy(), ecc." +support: + description: Ampiamente disponibile dal JDK 19 (settembre 2022) diff --git a/translations/content/it/concurrency/virtual-threads.yaml b/translations/content/it/concurrency/virtual-threads.yaml new file mode 100644 index 0000000..1ec945f --- /dev/null +++ b/translations/content/it/concurrency/virtual-threads.yaml @@ -0,0 +1,18 @@ +--- +title: Thread virtuali +oldApproach: Thread di piattaforma +modernApproach: Thread virtuali +summary: "Crea milioni di thread virtuali leggeri invece di pesanti thread OS." +explanation: "I thread virtuali sono thread leggeri gestiti dalla JVM, non dal sistema operativo. Puoi crearne milioni senza dover dimensionare i thread pool. Sono ideali per task I/O-bound come chiamate HTTP e query al database." +whyModernWins: +- icon: ⚡ + title: Leggeri + desc: "I thread virtuali usano KB di memoria, i thread di piattaforma usano MB." +- icon: ♾️ + title: Scalabili + desc: "Crea milioni di thread — nessuna necessità di dimensionare i pool." +- icon: 🧹 + title: Modello semplice + desc: "Scrivi codice bloccante che scala come il codice asincrono." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/datetime/date-formatting.yaml b/translations/content/it/datetime/date-formatting.yaml new file mode 100644 index 0000000..245db40 --- /dev/null +++ b/translations/content/it/datetime/date-formatting.yaml @@ -0,0 +1,18 @@ +--- +title: Formattazione delle date +oldApproach: SimpleDateFormat +modernApproach: DateTimeFormatter +summary: "Formatta le date con DateTimeFormatter thread-safe e immutabile." +explanation: "DateTimeFormatter è immutabile e thread-safe, a differenza di SimpleDateFormat. Può essere memorizzato come costante e condiviso. Sono disponibili formatter predefiniti come ISO_LOCAL_DATE per i formati comuni." +whyModernWins: +- icon: 🛡️ + title: Thread-safe + desc: "Condividi i formatter tra i thread senza sincronizzazione." +- icon: 📋 + title: Formati integrati + desc: "ISO_LOCAL_DATE, ISO_INSTANT, ecc. per i formati standard." +- icon: 🔒 + title: Immutabile + desc: "Memorizza in sicurezza come costante static final." +support: + description: Ampiamente disponibile dal JDK 8 (marzo 2014) diff --git a/translations/content/it/datetime/duration-and-period.yaml b/translations/content/it/datetime/duration-and-period.yaml new file mode 100644 index 0000000..d5691f3 --- /dev/null +++ b/translations/content/it/datetime/duration-and-period.yaml @@ -0,0 +1,18 @@ +--- +title: Duration e Period +oldApproach: Aritmetica in millisecondi +modernApproach: Duration / Period +summary: "Calcola le differenze di tempo con Duration e Period type-safe." +explanation: "Duration è per quantità basate sul tempo (ore, minuti, secondi). Period è per quantità basate sulla data (anni, mesi, giorni). ChronoUnit.between() per differenze semplici. Tutti gestiscono correttamente i casi limite." +whyModernWins: +- icon: 🎯 + title: Type-safe + desc: "Duration per il tempo, Period per le date — nessuna confusione." +- icon: 🛡️ + title: Calcoli corretti + desc: "Gestisce le transizioni DST, gli anni bisestili e i secondi intercalari." +- icon: 📖 + title: Leggibile + desc: "ChronoUnit.DAYS.between() si legge come in inglese." +support: + description: Ampiamente disponibile dal JDK 8 (marzo 2014) diff --git a/translations/content/it/datetime/hex-format.yaml b/translations/content/it/datetime/hex-format.yaml new file mode 100644 index 0000000..2a13b98 --- /dev/null +++ b/translations/content/it/datetime/hex-format.yaml @@ -0,0 +1,18 @@ +--- +title: HexFormat +oldApproach: Conversione esadecimale manuale +modernApproach: HexFormat +summary: "Converti tra stringhe esadecimali e array di byte con HexFormat." +explanation: "HexFormat fornisce codifica/decodifica esadecimale bidirezionale per byte, interi e array. Configura delimitatori, prefisso, suffisso e maiuscole/minuscole. Niente più formattazione o parsing manuale." +whyModernWins: +- icon: 📐 + title: Bidirezionale + desc: "Converti byte→hex e hex→byte con un'unica API." +- icon: 🔧 + title: Configurabile + desc: "Delimitatori, prefisso, suffisso, maiuscole/minuscole." +- icon: 📦 + title: Supporto array + desc: "Codifica/decodifica interi array di byte in una volta." +support: + description: Ampiamente disponibile dal JDK 17 LTS (settembre 2021) diff --git a/translations/content/it/datetime/instant-precision.yaml b/translations/content/it/datetime/instant-precision.yaml new file mode 100644 index 0000000..9934693 --- /dev/null +++ b/translations/content/it/datetime/instant-precision.yaml @@ -0,0 +1,18 @@ +--- +title: Instant con precisione al nanosecondo +oldApproach: Millisecondi +modernApproach: Nanosecondi +summary: "Ottieni timestamp con precisione al microsecondo o nanosecondo." +explanation: "Java 9 ha migliorato la risoluzione dell'orologio così che Instant.now() cattura la precisione al microsecondo sulla maggior parte delle piattaforme (nanosecondo su alcune). Il vecchio currentTimeMillis() fornisce solo millisecondi." +whyModernWins: +- icon: 🎯 + title: Maggiore precisione + desc: "Timestamp al microsecondo/nanosecondo invece che al millisecondo." +- icon: 📐 + title: Type-safe + desc: "Instant porta la sua precisione — nessun long ambiguo." +- icon: 🌐 + title: Basato su UTC + desc: "Instant è sempre in UTC — nessuna confusione di fuso orario." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/datetime/java-time-basics.yaml b/translations/content/it/datetime/java-time-basics.yaml new file mode 100644 index 0000000..2284f22 --- /dev/null +++ b/translations/content/it/datetime/java-time-basics.yaml @@ -0,0 +1,18 @@ +--- +title: Basi dell'API java.time +oldApproach: Date + Calendar +modernApproach: java.time.* +summary: "Usa tipi di data/ora immutabili e chiari invece di Date e Calendar." +explanation: "java.time fornisce LocalDate, LocalTime, LocalDateTime, Instant, ZonedDateTime — tutti immutabili e thread-safe. I mesi sono indicizzati a partire da 1. Niente più confusione con Calendar.JANUARY = 0." +whyModernWins: +- icon: 🔒 + title: Immutabile + desc: "I valori di data/ora non possono essere modificati accidentalmente." +- icon: 📖 + title: API chiara + desc: "Month.JANUARY, non 0. DayOfWeek.MONDAY, non 2." +- icon: 🛡️ + title: Thread-safe + desc: "Nessuna sincronizzazione necessaria — condividi liberamente tra i thread." +support: + description: Ampiamente disponibile dal JDK 8 (marzo 2014) diff --git a/translations/content/it/datetime/math-clamp.yaml b/translations/content/it/datetime/math-clamp.yaml new file mode 100644 index 0000000..6be1ec0 --- /dev/null +++ b/translations/content/it/datetime/math-clamp.yaml @@ -0,0 +1,18 @@ +--- +title: Math.clamp() +oldApproach: min/max annidati +modernApproach: Math.clamp() +summary: "Vincola un valore tra limiti con una singola chiamata chiara." +explanation: "Math.clamp(value, min, max) vincola un valore all'intervallo [min, max]. Più chiaro dei Math.min/Math.max annidati e disponibile per int, long, float e double." +whyModernWins: +- icon: 📖 + title: Auto-documentante + desc: "clamp(value, min, max) è inequivocabile." +- icon: 🛡️ + title: Meno soggetto a errori + desc: "Nessun rischio di invertire accidentalmente l'ordine min/max." +- icon: 🎯 + title: Tutti i tipi numerici + desc: "Funziona con int, long, float e double." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/enterprise/ejb-timer-vs-jakarta-scheduler.yaml b/translations/content/it/enterprise/ejb-timer-vs-jakarta-scheduler.yaml new file mode 100644 index 0000000..9c5bfd0 --- /dev/null +++ b/translations/content/it/enterprise/ejb-timer-vs-jakarta-scheduler.yaml @@ -0,0 +1,18 @@ +--- +title: Timer EJB vs Jakarta Scheduler +oldApproach: TimerService EJB +modernApproach: ManagedScheduledExecutorService +summary: "Sostituisci i pesanti timer EJB con ManagedScheduledExecutorService di Jakarta Concurrency per una pianificazione più semplice." +explanation: "I timer EJB richiedono un bean @Stateless o @Singleton con un callback @Timeout ed espressioni di pianificazione basate su XML o annotazioni. Jakarta Concurrency fornisce ManagedScheduledExecutorService, che usa la familiare API di pianificazione java.util.concurrent. Il risultato è meno boilerplate, test unitari più facili e nessuna dipendenza dal container EJB." +whyModernWins: +- icon: 🪶 + title: Boilerplate ridotto + desc: "Nessun callback @Timeout o ScheduleExpression — usa l'API standard ScheduledExecutorService." +- icon: 🧪 + title: Migliore testabilità + desc: "Metodi semplici e mock dell'executor rendono i test unitari semplici senza container EJB." +- icon: ☁️ + title: Cloud-native friendly + desc: "Gli executor gestiti si integrano con il ciclo di vita del container e funzionano in runtime leggeri." +support: + description: "Disponibile da Jakarta EE 10 / Concurrency 3.0" diff --git a/translations/content/it/enterprise/ejb-vs-cdi.yaml b/translations/content/it/enterprise/ejb-vs-cdi.yaml new file mode 100644 index 0000000..3f0773f --- /dev/null +++ b/translations/content/it/enterprise/ejb-vs-cdi.yaml @@ -0,0 +1,18 @@ +--- +title: EJB vs CDI +oldApproach: EJB +modernApproach: Bean CDI +summary: "Sostituisci gli EJB pesanti con bean CDI leggeri per dependency injection e transazioni." +explanation: "CDI (Contexts and Dependency Injection) fornisce la stessa dependency injection e gestione delle transazioni degli EJB, ma come semplici classi Java senza interfacce o superclassi specifiche per container. Gli scope come @ApplicationScoped e @RequestScoped controllano il ciclo di vita, e @Transactional sostituisce la semantica transazionale obbligatoria degli EJB." +whyModernWins: +- icon: 🪶 + title: Leggero + desc: "I bean CDI sono semplici classi Java senza interfacce o descrittori EJB." +- icon: 💉 + title: Iniezione unificata + desc: "@Inject funziona per ogni bean gestito, risorse JAX-RS e componenti Jakarta EE." +- icon: 🧪 + title: Test unitari facili + desc: "Le classi semplici senza overhead del proxy EJB sono facili da istanziare e simulare." +support: + description: Ampiamente disponibile da Jakarta EE 8 / Java 11 diff --git a/translations/content/it/enterprise/jdbc-resultset-vs-jpa-criteria.yaml b/translations/content/it/enterprise/jdbc-resultset-vs-jpa-criteria.yaml new file mode 100644 index 0000000..1577233 --- /dev/null +++ b/translations/content/it/enterprise/jdbc-resultset-vs-jpa-criteria.yaml @@ -0,0 +1,18 @@ +--- +title: Mapping JDBC ResultSet vs API Criteria JPA +oldApproach: JDBC ResultSet +modernApproach: API Criteria JPA +summary: "Sostituisci il mapping manuale JDBC ResultSet con l'API Criteria type-safe di JPA per le query dinamiche." +explanation: "Il JDBC grezzo richiede la costruzione di stringhe SQL, l'impostazione dei parametri per indice e il mapping manuale di ogni colonna ResultSet — un processo soggetto a errori che si rompe silenziosamente quando le colonne cambiano. L'API Criteria JPA costruisce query programmaticamente usando un pattern builder type-safe. I nomi delle colonne vengono validati rispetto al modello entità, il mapping dei risultati è automatico e le query dinamiche complesse si compongono in modo pulito senza concatenazione di stringhe." +whyModernWins: +- icon: 🔒 + title: Query type-safe + desc: "Il builder Criteria rileva i nomi dei campi e le mancate corrispondenze di tipo in fase di compilazione." +- icon: 🗺️ + title: Mapping automatico + desc: "JPA mappa le righe dei risultati in oggetti entità — nessuna estrazione manuale colonna per colonna." +- icon: 🧩 + title: Predicati componibili + desc: "Le clausole where dinamiche si costruiscono in modo pulito con and(), or() e oggetti Predicate riutilizzabili." +support: + description: Ampiamente disponibile da Jakarta EE 8 / Java 11 diff --git a/translations/content/it/enterprise/jdbc-vs-jooq.yaml b/translations/content/it/enterprise/jdbc-vs-jooq.yaml new file mode 100644 index 0000000..4ee139f --- /dev/null +++ b/translations/content/it/enterprise/jdbc-vs-jooq.yaml @@ -0,0 +1,18 @@ +--- +title: JDBC vs jOOQ +oldApproach: JDBC grezzo +modernApproach: jOOQ SQL DSL +summary: "Sostituisci il SQL basato su stringhe JDBC con il DSL SQL type-safe e fluente di jOOQ." +explanation: "jOOQ (Java Object Oriented Querying) genera codice Java dallo schema del database, trasformando i nomi di tabelle e colonne in costanti Java type-safe. Il DSL fluente rispecchia la sintassi SQL così le query sono leggibili e componibili. Tutti i parametri sono legati automaticamente, eliminando il rischio di SQL injection. A differenza di JPA/JPQL, jOOQ abbraccia pienamente SQL — funzioni finestra, CTE, clausole RETURNING ed estensioni specifiche del vendor sono tutte di prima classe." +whyModernWins: +- icon: 🔒 + title: Colonne type-safe + desc: "I nomi delle colonne sono costanti Java generate — i typo e le mancate corrispondenze di tipo diventano errori del compilatore invece di fallimenti runtime." +- icon: 📖 + title: Fluidità SQL + desc: "Il DSL jOOQ rispecchia da vicino la sintassi SQL, così i JOIN complessi, le subquery e i CTE rimangono leggibili." +- icon: 🛡️ + title: Injection-free by design + desc: "I parametri sono sempre legati in modo sicuro — nessuna concatenazione di stringhe significa nessun rischio di SQL injection." +support: + description: "L'edizione open-source di jOOQ supporta tutti i principali database open-source; i database commerciali più vecchi richiedono una licenza a pagamento" diff --git a/translations/content/it/enterprise/jdbc-vs-jpa.yaml b/translations/content/it/enterprise/jdbc-vs-jpa.yaml new file mode 100644 index 0000000..7d0908d --- /dev/null +++ b/translations/content/it/enterprise/jdbc-vs-jpa.yaml @@ -0,0 +1,18 @@ +--- +title: JDBC vs JPA +oldApproach: JDBC +modernApproach: EntityManager JPA +summary: "Sostituisci il verboso boilerplate JDBC con l'object-relational mapping JPA e EntityManager." +explanation: "JPA (Jakarta Persistence API) mappa gli oggetti Java alle righe del database, eliminando la necessità di elaborare manualmente i ResultSet e concatenare stringhe SQL. EntityManager fornisce find(), persist() e query JPQL così lavori con oggetti di dominio invece di SQL grezzo, mentre il container gestisce il connection pooling e le transazioni." +whyModernWins: +- icon: 🗺️ + title: Mapping degli oggetti + desc: "Le entità sono semplici classi annotate — nessuna traduzione manuale ResultSet-a-oggetto." +- icon: 🔒 + title: Query type-safe + desc: "JPQL opera su tipi di entità e campi invece di stringhe di tabella e colonna grezze." +- icon: ⚡ + title: Cache integrata + desc: "La cache di primo e secondo livello riduce automaticamente i round-trip al database." +support: + description: Ampiamente disponibile da Jakarta EE 8 / Java 11 diff --git a/translations/content/it/enterprise/jndi-lookup-vs-cdi-injection.yaml b/translations/content/it/enterprise/jndi-lookup-vs-cdi-injection.yaml new file mode 100644 index 0000000..cae6714 --- /dev/null +++ b/translations/content/it/enterprise/jndi-lookup-vs-cdi-injection.yaml @@ -0,0 +1,18 @@ +--- +title: Lookup JNDI vs Iniezione CDI +oldApproach: Lookup JNDI +modernApproach: CDI @Inject +summary: "Sostituisci i fragili lookup JNDI basati su stringhe con l'iniezione CDI type-safe per le risorse gestite dal container." +explanation: "Il pattern JNDI tradizionale ti costringe a usare nomi di risorse basati su stringhe, gestire NamingException e gestire un InitialContext. L'iniezione CDI con @Inject (o @Resource per le risorse container) lascia che il container crei automaticamente le dipendenze. I typo diventano errori di compilazione, e le classi sono più facili da testare perché le dipendenze possono essere iniettate direttamente." +whyModernWins: +- icon: 🔒 + title: Wiring type-safe + desc: "Gli errori di iniezione vengono rilevati al momento del deploy, non a runtime tramite lookup di stringhe." +- icon: 🗑️ + title: Nessun boilerplate + desc: "Elimina la creazione di InitialContext, le stringhe JNDI e la gestione di NamingException." +- icon: 🧪 + title: Testabile + desc: "Le dipendenze sono campi iniettati, facilmente sostituibili con mock nei test unitari." +support: + description: Ampiamente disponibile da Jakarta EE 8 / Java 11 diff --git a/translations/content/it/enterprise/jpa-vs-jakarta-data.yaml b/translations/content/it/enterprise/jpa-vs-jakarta-data.yaml new file mode 100644 index 0000000..0905ee9 --- /dev/null +++ b/translations/content/it/enterprise/jpa-vs-jakarta-data.yaml @@ -0,0 +1,18 @@ +--- +title: JPA vs Jakarta Data +oldApproach: EntityManager JPA +modernApproach: Repository Jakarta Data +summary: "Dichiara un'interfaccia repository e lascia che Jakarta Data generi automaticamente l'implementazione DAO." +explanation: "Jakarta Data (Jakarta EE 11) trasforma l'accesso ai dati in una pura dichiarazione di interfaccia. Annoti un'interfaccia con @Repository ed estendi un tipo di repository integrato come CrudRepository. Il runtime genera l'implementazione — incluse le query derivate dai nomi dei metodi come findByName — quindi non c'è boilerplate EntityManager, nessuna stringa JPQL e nessun metodo save/find scritto a mano." +whyModernWins: +- icon: 🪄 + title: Zero boilerplate + desc: "Dichiara l'interfaccia; il container genera l'intera implementazione DAO al deploy." +- icon: 🔍 + title: Query derivate + desc: "I nomi dei metodi come findByNameAndStatus vengono analizzati automaticamente — nessun JPQL o SQL necessario." +- icon: 🔌 + title: Portabile + desc: "Qualsiasi runtime conforme a Jakarta EE 11 fornisce l'implementazione del repository senza vendor lock-in." +support: + description: "Disponibile da Jakarta EE 11 / Java 21 (2024)" diff --git a/translations/content/it/enterprise/jsf-managed-bean-vs-cdi-named.yaml b/translations/content/it/enterprise/jsf-managed-bean-vs-cdi-named.yaml new file mode 100644 index 0000000..037cb18 --- /dev/null +++ b/translations/content/it/enterprise/jsf-managed-bean-vs-cdi-named.yaml @@ -0,0 +1,18 @@ +--- +title: JSF Managed Bean vs CDI Named Bean +oldApproach: "@ManagedBean" +modernApproach: "@Named + CDI" +summary: "Sostituisci il deprecato JSF @ManagedBean con CDI @Named per un modello unificato di dependency injection." +explanation: "JSF's @ManagedBean e @ManagedProperty sono stati deprecati in Jakarta Faces 2.3 e rimossi in Jakarta EE 10. Il sostituto CDI usa @Named per esporre il bean alle espressioni EL e @Inject per il cablaggio delle dipendenze. Questo unifica il modello di bean: le pagine JSF, le risorse JAX-RS e gli EJB condividono tutti lo stesso container CDI." +whyModernWins: +- icon: 🔗 + title: Modello unificato + desc: "Un container CDI gestisce tutti i bean — JSF, REST e i livelli di servizio condividono la stessa iniezione." +- icon: 🗑️ + title: Meno boilerplate + desc: "@Inject sostituisce @ManagedProperty e il suo metodo setter richiesto." +- icon: 🔮 + title: A prova di futuro + desc: "@ManagedBean è rimosso in Jakarta EE 10; @Named è il sostituto supportato." +support: + description: "CDI @Named disponibile da Java EE 6; @ManagedBean rimosso in Jakarta EE 10" diff --git a/translations/content/it/enterprise/manual-transaction-vs-declarative.yaml b/translations/content/it/enterprise/manual-transaction-vs-declarative.yaml new file mode 100644 index 0000000..6e510a2 --- /dev/null +++ b/translations/content/it/enterprise/manual-transaction-vs-declarative.yaml @@ -0,0 +1,18 @@ +--- +title: Transazione JPA manuale vs @Transactional dichiarativa +oldApproach: Transazione manuale +modernApproach: "@Transactional" +summary: "Sostituisci i verbosi blocchi begin/commit/rollback con una singola annotazione @Transactional." +explanation: "La gestione manuale delle transazioni richiede chiamate esplicite a begin(), commit() e rollback() avvolte in blocchi try-catch — ogni metodo di servizio ripete questo boilerplate. L'annotazione @Transactional delega la gestione del ciclo di vita al container: inizia una transazione prima del metodo, esegue il commit in caso di successo e il rollback in caso di RuntimeException automaticamente." +whyModernWins: +- icon: 🗑️ + title: Nessun boilerplate + desc: "Un'annotazione sostituisce i ripetitivi blocchi try-catch begin/commit/rollback." +- icon: 🛡️ + title: Rollback più sicuro + desc: "Il container garantisce il rollback sulle eccezioni non controllate — nessun rischio di dimenticare il blocco catch." +- icon: 📐 + title: Controllo dichiarativo + desc: "Propagazione, isolamento e regole di rollback sono espressi come attributi dell'annotazione." +support: + description: Ampiamente disponibile da Jakarta EE 8 / Java 11 diff --git a/translations/content/it/enterprise/mdb-vs-reactive-messaging.yaml b/translations/content/it/enterprise/mdb-vs-reactive-messaging.yaml new file mode 100644 index 0000000..f5a28ae --- /dev/null +++ b/translations/content/it/enterprise/mdb-vs-reactive-messaging.yaml @@ -0,0 +1,18 @@ +--- +title: Message-Driven Bean vs Reactive Messaging +oldApproach: Message-Driven Bean +modernApproach: Reactive Messaging +summary: "Sostituisci i JMS Message-Driven Bean con MicroProfile Reactive Messaging per un'elaborazione degli eventi più semplice." +explanation: "I Message-Driven Bean richiedono l'implementazione di MessageListener, la configurazione delle proprietà di attivazione e la deserializzazione manuale dei messaggi JMS. MicroProfile Reactive Messaging usa una semplice annotazione @Incoming su un metodo che riceve oggetti tipizzati direttamente. La configurazione del canale è esternalizzata, rendendo il codice broker-agnostico e molto più facile da testare." +whyModernWins: +- icon: 🪶 + title: Codice minimale + desc: "Un singolo metodo @Incoming sostituisce la classe MDB, l'interfaccia MessageListener e la configurazione di attivazione." +- icon: 🔌 + title: Broker-agnostico + desc: "Cambia i connector Kafka, AMQP o JMS tramite configurazione senza modificare il codice dell'applicazione." +- icon: ☁️ + title: Adatto al cloud-native + desc: "La backpressure degli stream reattivi e il runtime leggero lo rendono ideale per i deployment containerizzati." +support: + description: "Disponibile da MicroProfile 4.0 / SmallRye Reactive Messaging" diff --git a/translations/content/it/enterprise/servlet-vs-jaxrs.yaml b/translations/content/it/enterprise/servlet-vs-jaxrs.yaml new file mode 100644 index 0000000..e647aec --- /dev/null +++ b/translations/content/it/enterprise/servlet-vs-jaxrs.yaml @@ -0,0 +1,18 @@ +--- +title: Servlet vs JAX-RS +oldApproach: HttpServlet +modernApproach: Risorsa JAX-RS +summary: "Sostituisci il verboso boilerplate HttpServlet con classi di risorse JAX-RS dichiarative." +explanation: "JAX-RS (Jakarta RESTful Web Services) consente di esporre endpoint REST usando semplici annotazioni come @GET, @Path e @Produces. Niente più parsing manuale dei parametri di richiesta o impostazione dei tipi di contenuto sulla risposta — il runtime gestisce automaticamente il marshalling e il routing." +whyModernWins: +- icon: 📐 + title: Routing dichiarativo + desc: "Le annotazioni definiscono il metodo HTTP, il percorso e il tipo di contenuto invece del dispatch imperativo if/else." +- icon: 🔄 + title: Marshalling automatico + desc: "Restituisci POJO direttamente; il runtime li serializza in JSON o XML in base a @Produces." +- icon: 🧪 + title: Test più facile + desc: "Le classi di risorse sono semplici oggetti Java, testabili senza un container servlet." +support: + description: Ampiamente disponibile da Jakarta EE 8 / Java 11 diff --git a/translations/content/it/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml b/translations/content/it/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml new file mode 100644 index 0000000..0919d7b --- /dev/null +++ b/translations/content/it/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml @@ -0,0 +1,18 @@ +--- +title: Singleton EJB vs CDI @ApplicationScoped +oldApproach: "@Singleton EJB" +modernApproach: "@ApplicationScoped CDI" +summary: "Sostituisci i Singleton EJB con bean CDI @ApplicationScoped per una gestione più semplice dello stato condiviso." +explanation: "I Singleton EJB raggruppano la gestione della concorrenza (@Lock, @ConcurrencyManagement) e l'inizializzazione eager (@Startup) nel container EJB. Un bean CDI @ApplicationScoped ottiene lo stesso ciclo di vita a istanza singola con molta meno cerimonia. Quando è necessario il controllo della concorrenza, le utilità standard java.util.concurrent danno un controllo più granulare rispetto alle annotazioni di lock EJB." +whyModernWins: +- icon: 🪶 + title: Meno rumore di annotazioni + desc: "Nessun @ConcurrencyManagement, @Lock o @Startup — solo una singola annotazione @ApplicationScoped." +- icon: 🔧 + title: Concorrenza flessibile + desc: "Usa lock java.util.concurrent o volatile per la thread-safety di cui hai esattamente bisogno." +- icon: 🧪 + title: Test facile + desc: "I semplici bean CDI possono essere istanziati direttamente nei test senza un container EJB." +support: + description: Ampiamente disponibile da Jakarta EE 8 / Java 11 diff --git a/translations/content/it/enterprise/soap-vs-jakarta-rest.yaml b/translations/content/it/enterprise/soap-vs-jakarta-rest.yaml new file mode 100644 index 0000000..349e012 --- /dev/null +++ b/translations/content/it/enterprise/soap-vs-jakarta-rest.yaml @@ -0,0 +1,18 @@ +--- +title: Web Service SOAP vs Jakarta REST +oldApproach: JAX-WS / SOAP +modernApproach: Jakarta REST / JSON +summary: "Sostituisci i pesanti endpoint SOAP/WSDL con pulite risorse Jakarta REST che restituiscono JSON." +explanation: "I web service basati su SOAP si basano su contratti WSDL, marshalling XML e annotazioni JAX-WS che aggiungono un overhead significativo. Jakarta REST (ex JAX-RS) usa annotazioni intuitive come @GET, @Path e @Produces per esporre API RESTful JSON. Il modello di programmazione è più semplice, i payload sono più piccoli e l'approccio si allinea con il modo in cui i moderni microservizi comunicano." +whyModernWins: +- icon: 🪶 + title: Payload più leggeri + desc: "JSON è più compatto degli involucri XML SOAP, riducendo la larghezza di banda e l'overhead di parsing." +- icon: 📐 + title: Annotazioni semplici + desc: "@GET, @Path e @Produces sostituiscono la cerimonia di WSDL, @WebService e @WebMethod." +- icon: 🔌 + title: Pronto per microservizi + desc: "REST/JSON è lo standard per la comunicazione servizio-a-servizio nelle architetture cloud-native." +support: + description: Ampiamente disponibile da Jakarta EE 8 / Java 11 diff --git a/translations/content/it/enterprise/spring-api-versioning.yaml b/translations/content/it/enterprise/spring-api-versioning.yaml new file mode 100644 index 0000000..88bca7a --- /dev/null +++ b/translations/content/it/enterprise/spring-api-versioning.yaml @@ -0,0 +1,18 @@ +--- +title: Versionamento API Spring Framework 7 +oldApproach: Versionamento manuale del percorso URL +modernApproach: Versionamento API nativo +summary: "Sostituisci i controller duplicati con prefisso versione con il supporto nativo al versionamento API di Spring Framework 7." +explanation: "Prima di Spring Framework 7, il versionamento API richiedeva classi controller separate per versione (es. /api/v1/products, /api/v2/products), duplicando i mapping delle richieste e disperdendo la logica delle versioni su molti file. Spring Framework 7 introduce il versionamento nativo tramite un nuovo attributo version su @RequestMapping e le annotazioni correlate, più un hook configureApiVersioning in WebMvcConfigurer. La versione può essere risolta da un header di richiesta, un segmento del percorso URL o un parametro di query — tutto controllato in un unico posto." +whyModernWins: +- icon: 🗂️ + title: Nessuna duplicazione del controller + desc: "Tutte le versioni risiedono in una sola classe controller; solo i singoli metodi handler portano un attributo di versione." +- icon: ⚙️ + title: Strategia di versione centralizzata + desc: "Passa da header a URL o versionamento con parametro query in una singola chiamata configureApiVersioning." +- icon: 📈 + title: Evoluzione incrementale + desc: "Aggiungi una nuova versione a un metodo senza toccare endpoint non correlati o creare nuovi file controller." +support: + description: "Disponibile da Spring Framework 7.0 (richiede Java 17+)" diff --git a/translations/content/it/enterprise/spring-null-safety-jspecify.yaml b/translations/content/it/enterprise/spring-null-safety-jspecify.yaml new file mode 100644 index 0000000..02ce981 --- /dev/null +++ b/translations/content/it/enterprise/spring-null-safety-jspecify.yaml @@ -0,0 +1,18 @@ +--- +title: Spring Null Safety con JSpecify +oldApproach: Spring @NonNull/@Nullable +modernApproach: JSpecify @NullMarked +summary: "Spring 7 adotta le annotazioni JSpecify, rendendo non-null il default e riducendo il rumore delle annotazioni." +explanation: "Spring 5 e 6 hanno introdotto le proprie annotazioni di null safety nel package `org.springframework.lang`. Sebbene utili, erano specifiche del framework e richiedevano l'annotazione esplicita di ogni elemento non-null. Spring 7 migra a JSpecify, uno standard cross-ecosistema per la null safety. L'annotazione `@NullMarked` a livello di classe o package dichiara che tutti i tipi non annotati sono non-null per default. Solo i tipi effettivamente nullable necessitano dell'annotazione `@Nullable`, riducendo drasticamente la verbosità. Le annotazioni JSpecify sono riconosciute dai principali strumenti di analisi statica come NullAway, Error Prone e IntelliJ IDEA." +whyModernWins: +- icon: ✂️ + title: Non-null per default + desc: "@NullMarked rende tutti i tipi non annotati non-null, così solo le eccezioni nullable necessitano di annotazione." +- icon: 🌐 + title: Standard dell'ecosistema + desc: "Le annotazioni JSpecify sono uno standard cross-framework riconosciuto da NullAway, Error Prone e IDE." +- icon: 🔍 + title: Strumenti più ricchi + desc: "I moderni analizzatori statici comprendono il modello null di JSpecify e segnalano le violazioni in fase di compilazione." +support: + description: "Disponibile da Spring Framework 7.0 (richiede Java 17+)" diff --git a/translations/content/it/enterprise/spring-xml-config-vs-annotations.yaml b/translations/content/it/enterprise/spring-xml-config-vs-annotations.yaml new file mode 100644 index 0000000..23cee07 --- /dev/null +++ b/translations/content/it/enterprise/spring-xml-config-vs-annotations.yaml @@ -0,0 +1,18 @@ +--- +title: Configurazione Spring XML vs Annotation-Driven +oldApproach: Definizioni bean XML +modernApproach: Bean annotation-driven +summary: "Sostituisci le verbose definizioni di bean Spring XML con la configurazione annotation-driven concisa in Spring Boot." +explanation: "Le applicazioni Spring tradizionali cablano i bean attraverso file di configurazione XML, dichiarando ogni classe e le sue dipendenze come elementi verbosi. Sebbene il supporto alle annotazioni esistesse da Spring 2.5, XML rimase l'approccio dominante finché Spring Boot non introdusse la auto-configurazione. Spring Boot rileva i bean annotati con @Component, @Service, @Repository e @Controller tramite la scansione del classpath, soddisfa le dipendenze tramite constructor injection automaticamente e configura l'infrastruttura come DataSource dal classpath — eliminando tutti i file XML di cablaggio." +whyModernWins: +- icon: 🚫 + title: Nessun XML + desc: "@SpringBootApplication attiva la scansione dei componenti e la auto-configurazione, eliminando tutti i file XML di cablaggio." +- icon: 💉 + title: Constructor injection + desc: "Spring inietta le dipendenze tramite costruttori automaticamente, rendendo i bean più facili da testare e ragionare." +- icon: ⚡ + title: Auto-configurazione + desc: "Spring Boot configura DataSource, JPA e altra infrastruttura dal classpath senza boilerplate." +support: + description: "Ampiamente disponibile da Spring Boot 1.0 (aprile 2014); Spring Boot 3 richiede Java 17+" diff --git a/translations/content/it/errors/helpful-npe.yaml b/translations/content/it/errors/helpful-npe.yaml new file mode 100644 index 0000000..fdfaf3c --- /dev/null +++ b/translations/content/it/errors/helpful-npe.yaml @@ -0,0 +1,18 @@ +--- +title: NullPointerException utili +oldApproach: NPE criptiche +modernApproach: NPE dettagliate +summary: "La JVM indica automaticamente quale variabile era null." +explanation: "Le NPE utili descrivono quale espressione era null e quale operazione è fallita. Sono abilitate per default da Java 14 — nessuna modifica al codice necessaria, basta aggiornare il JDK." +whyModernWins: +- icon: 🔍 + title: Variabile esatta + desc: "Il messaggio nomina la variabile null nella catena." +- icon: ⚡ + title: Debug più veloce + desc: "Non serve più indovinare quale delle 5 chiamate concatenate era null." +- icon: 🆓 + title: Aggiornamento gratuito + desc: "Nessuna modifica al codice — basta eseguire su JDK 14+." +support: + description: Ampiamente disponibile dal JDK 14 (marzo 2020) diff --git a/translations/content/it/errors/multi-catch.yaml b/translations/content/it/errors/multi-catch.yaml new file mode 100644 index 0000000..19dfc65 --- /dev/null +++ b/translations/content/it/errors/multi-catch.yaml @@ -0,0 +1,18 @@ +--- +title: Gestione multi-catch delle eccezioni +oldApproach: Blocchi catch separati +modernApproach: Multi-catch +summary: "Cattura più tipi di eccezione in un singolo blocco catch." +explanation: "Multi-catch gestisce più tipi di eccezione con lo stesso codice. La variabile eccezione è effettivamente final, quindi puoi rilanciare senza wrapping." +whyModernWins: +- icon: 📏 + title: DRY + desc: "La stessa logica di gestione scritta una volta invece di tre." +- icon: 🔄 + title: Rilanciabile + desc: "L'eccezione catturata può essere rilanciata con il suo tipo preciso." +- icon: 📖 + title: Scansionabile + desc: "Tutti i tipi gestiti sono visibili in un posto." +support: + description: Ampiamente disponibile dal JDK 7 (luglio 2011) diff --git a/translations/content/it/errors/null-in-switch.yaml b/translations/content/it/errors/null-in-switch.yaml new file mode 100644 index 0000000..fd716bd --- /dev/null +++ b/translations/content/it/errors/null-in-switch.yaml @@ -0,0 +1,18 @@ +--- +title: Caso null in switch +oldApproach: Guardia prima dello switch +modernApproach: case null +summary: "Gestisci null direttamente come caso di uno switch — nessuna guardia separata necessaria." +explanation: "Lo switch con pattern matching può corrispondere a null come etichetta case. Questo elimina la necessità di un controllo null prima dello switch e rende la gestione del null esplicita e visibile." +whyModernWins: +- icon: 🎯 + title: Esplicito + desc: "La gestione del null è visibile direttamente nello switch." +- icon: 🛡️ + title: Nessuna NPE + desc: "Lo switch su un valore null non lancerà NullPointerException." +- icon: 📐 + title: Tutto-in-uno + desc: "Tutti i casi incluso null in un singolo switch." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/errors/optional-chaining.yaml b/translations/content/it/errors/optional-chaining.yaml new file mode 100644 index 0000000..f7840f2 --- /dev/null +++ b/translations/content/it/errors/optional-chaining.yaml @@ -0,0 +1,18 @@ +--- +title: Concatenazione Optional +oldApproach: Controlli null annidati +modernApproach: Pipeline Optional +summary: "Sostituisci i controlli null annidati con una pipeline Optional." +explanation: "Optional.map() concatena attraverso valori nullable, cortocircuitando al primo null. orElse() fornisce il default. Questo elimina la piramide della morte nei controlli null." +whyModernWins: +- icon: 🔗 + title: Concatenabile + desc: "Ogni passo .map() gestisce il null in modo trasparente." +- icon: 📖 + title: Flusso lineare + desc: "Leggi da sinistra a destra invece di blocchi if annidati." +- icon: 🛡️ + title: A prova di NPE + desc: "Il null è gestito ad ogni passo — nessun crash possibile." +support: + description: "Disponibile dal JDK 8+ (migliorato in 9+)" diff --git a/translations/content/it/errors/optional-orelsethrow.yaml b/translations/content/it/errors/optional-orelsethrow.yaml new file mode 100644 index 0000000..1d16528 --- /dev/null +++ b/translations/content/it/errors/optional-orelsethrow.yaml @@ -0,0 +1,18 @@ +--- +title: Optional.orElseThrow() senza supplier +oldApproach: get() o orElseThrow(supplier) +modernApproach: orElseThrow() +summary: "Usa Optional.orElseThrow() come alternativa più chiara e rivelante l'intento a get()." +explanation: "Optional.get() è ampiamente considerato un code smell perché nasconde la possibilità di fallimento. Il orElseThrow() senza argomenti, aggiunto in Java 10, fa esattamente la stessa cosa ma rende l'intento esplicito: lo sviluppatore si aspetta un valore e vuole un'eccezione se assente." +whyModernWins: +- icon: 📖 + title: Auto-documentante + desc: "orElseThrow() segnala chiaramente che l'assenza è inaspettata." +- icon: 🔒 + title: Evita get() + desc: "Gli strumenti di analisi statica segnalano get() come rischioso; orElseThrow() è idiomatico." +- icon: ⚡ + title: Meno boilerplate + desc: "Non è necessario passare un supplier per il NoSuchElementException predefinito." +support: + description: "Disponibile dal JDK 10 (marzo 2018)." diff --git a/translations/content/it/errors/record-based-errors.yaml b/translations/content/it/errors/record-based-errors.yaml new file mode 100644 index 0000000..5dd2221 --- /dev/null +++ b/translations/content/it/errors/record-based-errors.yaml @@ -0,0 +1,18 @@ +--- +title: Risposte di errore basate su record +oldApproach: Map o classe verbosa +modernApproach: Record di errore +summary: "Usa i record per tipi di risposta errore concisi e immutabili." +explanation: "I record sono perfetti per le risposte di errore — sono immutabili, hanno equals/hashCode integrati per il confronto e toString per il logging. I costruttori personalizzati aggiungono validazione o valori predefiniti." +whyModernWins: +- icon: 📏 + title: Conciso + desc: "Definisci i tipi di errore in 3 righe invece di 30." +- icon: 🔒 + title: Immutabile + desc: "I dati dell'errore non possono essere modificati accidentalmente dopo la creazione." +- icon: 📋 + title: toString automatico + desc: "Perfetto per il logging — mostra tutti i campi automaticamente." +support: + description: Ampiamente disponibile dal JDK 16 (marzo 2021) diff --git a/translations/content/it/errors/require-nonnull-else.yaml b/translations/content/it/errors/require-nonnull-else.yaml new file mode 100644 index 0000000..b40ce09 --- /dev/null +++ b/translations/content/it/errors/require-nonnull-else.yaml @@ -0,0 +1,18 @@ +--- +title: Objects.requireNonNullElse() +oldApproach: Controllo null ternario +modernApproach: requireNonNullElse() +summary: "Ottieni un valore non-null con un default chiaro, senza ternario." +explanation: "requireNonNullElse restituisce il primo argomento se non-null, altrimenti il secondo. Il default stesso non può essere null — lancia NPE se entrambi sono null, catturando i bug precocemente." +whyModernWins: +- icon: 📖 + title: Intento chiaro + desc: "Il nome del metodo descrive esattamente cosa fa." +- icon: 🛡️ + title: Default null-safe + desc: "Anche il valore di default viene controllato per null." +- icon: 📏 + title: Leggibile + desc: "Meglio del ternario per la semplice logica null-o-default." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/io/deserialization-filters.yaml b/translations/content/it/io/deserialization-filters.yaml new file mode 100644 index 0000000..aba53a7 --- /dev/null +++ b/translations/content/it/io/deserialization-filters.yaml @@ -0,0 +1,18 @@ +--- +title: Filtri di deserializzazione +oldApproach: Accetta tutto +modernApproach: ObjectInputFilter +summary: "Limita le classi che possono essere deserializzate per prevenire gli attacchi." +explanation: "ObjectInputFilter permette di creare allowlist/denylist di classi, limitare la profondità del grafo degli oggetti, le dimensioni degli array e i conteggi dei riferimenti. Difende dalle vulnerabilità di deserializzazione senza librerie esterne." +whyModernWins: +- icon: 🛡️ + title: Sicurezza + desc: "Previene la deserializzazione di classi inaspettate/malevole." +- icon: 📐 + title: Granulare + desc: "Controlla profondità, dimensione array, riferimenti e pattern di classi." +- icon: 🏗️ + title: A livello JVM + desc: "Imposta un filtro globale per tutta la deserializzazione nella JVM." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/io/file-memory-mapping.yaml b/translations/content/it/io/file-memory-mapping.yaml new file mode 100644 index 0000000..5078b83 --- /dev/null +++ b/translations/content/it/io/file-memory-mapping.yaml @@ -0,0 +1,18 @@ +--- +title: Mappatura in memoria di file +oldApproach: MappedByteBuffer +modernApproach: MemorySegment con Arena +summary: "Mappa file più grandi di 2 GB con pulizia deterministica usando MemorySegment." +explanation: "L'API Foreign Function & Memory (JEP 454) introduce MemorySegment per un accesso sicuro ed efficiente alla memoria. A differenza di MappedByteBuffer, MemorySegment supporta file più grandi di 2 GB (Integer.MAX_VALUE), fornisce pulizia deterministica tramite Arena e offre prestazioni migliori con l'hardware moderno." +whyModernWins: +- icon: 📏 + title: Nessun limite di dimensione + desc: "Mappa file più grandi di 2 GB senza workaround." +- icon: 🔒 + title: Pulizia deterministica + desc: "Arena garantisce che la memoria venga liberata all'uscita dello scope, non al momento del GC." +- icon: ⚡ + title: Prestazioni migliori + desc: "Allineato con i moderni modelli di memoria e hardware." +support: + description: "Disponibile dal JDK 22 (marzo 2024)" diff --git a/translations/content/it/io/files-mismatch.yaml b/translations/content/it/io/files-mismatch.yaml new file mode 100644 index 0000000..5437f56 --- /dev/null +++ b/translations/content/it/io/files-mismatch.yaml @@ -0,0 +1,18 @@ +--- +title: Files.mismatch() +oldApproach: Confronto byte per byte manuale +modernApproach: Files.mismatch() +summary: "Confronta due file in modo efficiente senza caricarli in memoria." +explanation: "Files.mismatch() restituisce la posizione del primo byte che differisce, o -1 se i file sono identici. Legge in modo lazy e cortocircuita alla prima differenza." +whyModernWins: +- icon: ⚡ + title: Efficiente in memoria + desc: "Non carica interi file in array di byte." +- icon: 🎯 + title: Individua la differenza + desc: "Restituisce la posizione esatta del primo byte diverso." +- icon: 📏 + title: Una chiamata + desc: "Nessuna logica di confronto array di byte manuale." +support: + description: Ampiamente disponibile dal JDK 12 (marzo 2019) diff --git a/translations/content/it/io/http-client.yaml b/translations/content/it/io/http-client.yaml new file mode 100644 index 0000000..c3bbbeb --- /dev/null +++ b/translations/content/it/io/http-client.yaml @@ -0,0 +1,18 @@ +--- +title: Client HTTP moderno +oldApproach: HttpURLConnection +modernApproach: HttpClient +summary: "Usa l'HttpClient integrato per richieste HTTP pulite e moderne." +explanation: "HttpClient supporta HTTP/1.1 e HTTP/2, richieste asincrone, WebSocket, executor personalizzati e connection pooling. Niente più casting di URLConnection o lettura manuale di InputStream." +whyModernWins: +- icon: 📐 + title: API Builder + desc: "Builder fluente per richieste, header e timeout." +- icon: 🔄 + title: Supporto HTTP/2 + desc: "HTTP/2 integrato con multiplexing e server push." +- icon: ⚡ + title: Pronto per asincrono + desc: "sendAsync() restituisce CompletableFuture." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/content/it/io/inputstream-transferto.yaml b/translations/content/it/io/inputstream-transferto.yaml new file mode 100644 index 0000000..e06eb1b --- /dev/null +++ b/translations/content/it/io/inputstream-transferto.yaml @@ -0,0 +1,18 @@ +--- +title: InputStream.transferTo() +oldApproach: Loop di copia manuale +modernApproach: transferTo() +summary: "Copia un InputStream su un OutputStream in una chiamata." +explanation: "transferTo() legge tutti i byte dal flusso di input e li scrive nel flusso di output. Nessuna gestione del buffer, nessun loop. Usa un buffer interno ottimizzato." +whyModernWins: +- icon: 📏 + title: Una riga + desc: "Sostituisci l'intero loop di lettura/scrittura con una chiamata a metodo." +- icon: ⚡ + title: Ottimizzato + desc: "La dimensione del buffer interno è ottimizzata per le prestazioni." +- icon: 🛡️ + title: Nessun bug + desc: "Nessun errore off-by-one nella gestione del buffer." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/io/io-class-console-io.yaml b/translations/content/it/io/io-class-console-io.yaml new file mode 100644 index 0000000..e6b7049 --- /dev/null +++ b/translations/content/it/io/io-class-console-io.yaml @@ -0,0 +1,18 @@ +--- +title: Classe IO per I/O da console +oldApproach: System.out / Scanner +modernApproach: Classe IO +summary: "La nuova classe IO fornisce metodi semplici e concisi per input e output da console." +explanation: "Java 25 introduce la classe IO (java.io.IO) come parte della funzionalità delle classi dichiarate implicitamente. Fornisce metodi statici come println(), print(), readln() e read() che sostituiscono la verbosa combinazione di System.out e Scanner. IO.readln(prompt) gestisce sia il prompting che la lettura in una singola chiamata. La classe è disponibile automaticamente nei file sorgente compatti e può essere utilizzata nelle classi tradizionali tramite import." +whyModernWins: +- icon: ✨ + title: Molto più semplice + desc: "Due metodi sostituiscono sette righe di setup Scanner, prompting, lettura e pulizia." +- icon: 🔒 + title: Nessuna perdita di risorse + desc: "Nessun Scanner da chiudere — i metodi IO gestiscono internamente le risorse." +- icon: 🎓 + title: Adatto ai principianti + desc: "I nuovi sviluppatori possono fare I/O da console senza imparare Scanner, System.out o le istruzioni import." +support: + description: "Anteprima nel JDK 25 come parte delle classi dichiarate implicitamente (JEP 495)" diff --git a/translations/content/it/io/path-of.yaml b/translations/content/it/io/path-of.yaml new file mode 100644 index 0000000..81c8a6f --- /dev/null +++ b/translations/content/it/io/path-of.yaml @@ -0,0 +1,18 @@ +--- +title: Factory Path.of() +oldApproach: Paths.get() +modernApproach: Path.of() +summary: "Usa Path.of() — il moderno metodo factory sull'interfaccia Path." +explanation: "Path.of() è un metodo factory aggiunto direttamente all'interfaccia Path, sostituendo la classe di utilità Paths separata. È più rilevabile e coerente con List.of(), Map.of(), ecc." +whyModernWins: +- icon: 📐 + title: API coerente + desc: "Segue il pattern factory .of() come List.of(), Set.of()." +- icon: 📖 + title: Rilevabile + desc: "Trovato sul tipo Path stesso, non in una classe Paths separata." +- icon: 🧹 + title: Una classe in meno + desc: "Non è necessario importare la classe di utilità Paths." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/content/it/io/reading-files.yaml b/translations/content/it/io/reading-files.yaml new file mode 100644 index 0000000..5640b7e --- /dev/null +++ b/translations/content/it/io/reading-files.yaml @@ -0,0 +1,18 @@ +--- +title: Lettura di file +oldApproach: BufferedReader +modernApproach: Files.readString() +summary: "Leggi un intero file in una String con una riga." +explanation: "Files.readString() legge l'intero contenuto di un file in una String. Gestisce la codifica (UTF-8 per default) e la pulizia delle risorse. Per file grandi, usa Files.lines() per lo streaming lazy." +whyModernWins: +- icon: 📏 + title: Una riga + desc: "Sostituisci 8 righe di boilerplate BufferedReader." +- icon: 🧹 + title: Pulizia automatica + desc: "Il file handle viene chiuso automaticamente." +- icon: 🌐 + title: UTF-8 per default + desc: "Codifica corretta per default — nessuna confusione di charset." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/content/it/io/try-with-resources-effectively-final.yaml b/translations/content/it/io/try-with-resources-effectively-final.yaml new file mode 100644 index 0000000..e5db21c --- /dev/null +++ b/translations/content/it/io/try-with-resources-effectively-final.yaml @@ -0,0 +1,18 @@ +--- +title: Miglioramento try-with-resources +oldApproach: Ri-dichiarazione variabile +modernApproach: Effettivamente final +summary: "Usa direttamente le variabili effettivamente final nel try-with-resources." +explanation: "Java 9 consente alle variabili effettivamente final di essere usate direttamente nel try-with-resources senza ri-dichiarazione. Questo è più pulito quando la risorsa è stata creata fuori dal blocco try." +whyModernWins: +- icon: 🧹 + title: Nessuna ri-dichiarazione + desc: "Usa direttamente il nome della variabile esistente." +- icon: 📖 + title: Meno confusione + desc: "Nessun nome di variabile separato all'interno del blocco try." +- icon: 📏 + title: Conciso + desc: "Meno righe, stessa sicurezza delle risorse." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/io/writing-files.yaml b/translations/content/it/io/writing-files.yaml new file mode 100644 index 0000000..9628f7f --- /dev/null +++ b/translations/content/it/io/writing-files.yaml @@ -0,0 +1,18 @@ +--- +title: Scrittura di file +oldApproach: FileWriter + BufferedWriter +modernApproach: Files.writeString() +summary: "Scrivi una String su un file con una riga." +explanation: "Files.writeString() scrive il contenuto su un file con codifica UTF-8 per default. È possibile passare opzioni per l'accodamento, la creazione, ecc." +whyModernWins: +- icon: 📏 + title: Una riga + desc: "Nessun wrapping di writer o try-with-resources necessario." +- icon: 🛡️ + title: Default sicuri + desc: "Codifica UTF-8, pulizia corretta del file handle." +- icon: 🔧 + title: Opzioni + desc: "Passa flag OpenOption per accodamento, creazione, ecc." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/content/it/language/compact-canonical-constructor.yaml b/translations/content/it/language/compact-canonical-constructor.yaml new file mode 100644 index 0000000..b93e99c --- /dev/null +++ b/translations/content/it/language/compact-canonical-constructor.yaml @@ -0,0 +1,18 @@ +--- +title: Costruttore canonico compatto +oldApproach: Validazione costruttore esplicita +modernApproach: Costruttore compatto +summary: "Valida e normalizza i campi del record senza ripetere le liste di parametri." +explanation: "I record possono dichiarare un costruttore canonico compatto che omette la lista dei parametri e le assegnazioni dei campi. Il compilatore assegna automaticamente i parametri ai campi dopo l'esecuzione della tua logica di validazione. Ideale per controlli preliminari, copie difensive e normalizzazione." +whyModernWins: +- icon: ✂️ + title: Meno ripetizione + desc: "Non è necessario ripetere la lista dei parametri o assegnare manualmente ogni campo." +- icon: 🛡️ + title: Validazione + desc: "Perfetto per controlli null, validazione degli intervalli e copie difensive." +- icon: 📖 + title: Intento più chiaro + desc: "La sintassi compatta enfatizza la validazione, non il boilerplate." +support: + description: Ampiamente disponibile dal JDK 16 (marzo 2021) diff --git a/translations/content/it/language/compact-source-files.yaml b/translations/content/it/language/compact-source-files.yaml new file mode 100644 index 0000000..4418bde --- /dev/null +++ b/translations/content/it/language/compact-source-files.yaml @@ -0,0 +1,18 @@ +--- +title: File sorgente compatti +oldApproach: Classe main con cerimonia +modernApproach: void main() +summary: "Scrivi un programma completo senza dichiarazione di classe o public static void main." +explanation: "I file sorgente compatti rimuovono la cerimonia delle dichiarazioni di classe e la firma del metodo main per programmi semplici. Combinati con l'importazione implicita di java.io.IO, anche println è disponibile direttamente." +whyModernWins: +- icon: 🚀 + title: Zero cerimonia + desc: "Nessuna classe, nessun public static void main, nessun String[] args." +- icon: 🎓 + title: Adatto ai principianti + desc: "I nuovi programmatori possono scrivere codice utile dalla prima riga." +- icon: 📝 + title: Simile a script + desc: "Perfetto per prototipi veloci, script ed esempi." +support: + description: "Finalizzato nel JDK 25 LTS (JEP 512, settembre 2025)." diff --git a/translations/content/it/language/default-interface-methods.yaml b/translations/content/it/language/default-interface-methods.yaml new file mode 100644 index 0000000..3368a18 --- /dev/null +++ b/translations/content/it/language/default-interface-methods.yaml @@ -0,0 +1,18 @@ +--- +title: Metodi default nelle interfacce +oldApproach: Classi astratte per comportamento condiviso +modernApproach: Metodi default nelle interfacce +summary: "Aggiungi implementazioni di metodi direttamente nelle interfacce, abilitando l'ereditarietà multipla del comportamento." +explanation: "Prima di Java 8, condividere il comportamento tra classi non correlate richiedeva classi astratte, che limitavano all'ereditarietà singola. I metodi default permettono alle interfacce di fornire implementazioni di metodi, così le classi possono ereditare comportamento da più interfacce. Questo è stato essenziale per evolvere le API Collections (es. List.forEach, Map.getOrDefault) senza rompere le implementazioni esistenti." +whyModernWins: +- icon: 🔀 + title: Ereditarietà multipla + desc: "Le classi possono implementare molte interfacce con metodi default, a differenza dell'ereditarietà da una singola classe astratta." +- icon: 📦 + title: Evoluzione dell'API + desc: "Aggiungi nuovi metodi alle interfacce senza rompere le implementazioni esistenti." +- icon: 🧩 + title: Comportamento componibile + desc: "Mescola e abbina le capacità di più interfacce liberamente." +support: + description: "Disponibile dal JDK 8 (marzo 2014)." diff --git a/translations/content/it/language/diamond-operator.yaml b/translations/content/it/language/diamond-operator.yaml new file mode 100644 index 0000000..9d6bcce --- /dev/null +++ b/translations/content/it/language/diamond-operator.yaml @@ -0,0 +1,18 @@ +--- +title: Diamond con classi anonime +oldApproach: Ripeti gli argomenti di tipo +modernApproach: Diamond <> +summary: "L'operatore diamond ora funziona anche con le classi anonime." +explanation: "Java 7 ha introdotto <> ma non funzionava con le classi interne anonime. Java 9 ha corretto questo, quindi non è mai necessario ripetere gli argomenti di tipo sul lato destro." +whyModernWins: +- icon: 📏 + title: Regole coerenti + desc: "Diamond funziona ovunque — costruttori e classi anonime allo stesso modo." +- icon: 🧹 + title: Meno ridondanza + desc: "Gli argomenti di tipo sono indicati una volta a sinistra, mai ripetuti." +- icon: 🔧 + title: Principio DRY + desc: "Il compilatore conosce già il tipo — perché scriverlo due volte?" +support: + description: "Diamond con classi anonime dal JDK 9 (settembre 2017)." diff --git a/translations/content/it/language/exhaustive-switch.yaml b/translations/content/it/language/exhaustive-switch.yaml new file mode 100644 index 0000000..76eb6e2 --- /dev/null +++ b/translations/content/it/language/exhaustive-switch.yaml @@ -0,0 +1,18 @@ +--- +title: Switch esaustivo senza default +oldApproach: Default obbligatorio +modernApproach: Esaustività sealed +summary: "Il compilatore verifica che tutti i sottotipi sealed siano coperti — nessun default necessario." +explanation: "Quando si usa lo switch su un tipo sealed, il compilatore conosce tutti i possibili sottotipi e verifica che ogni caso sia gestito. Se aggiungi un nuovo sottotipo, il compilatore segnala ogni switch ora incompleto." +whyModernWins: +- icon: ✅ + title: Sicurezza in fase di compilazione + desc: "Aggiungi un nuovo sottotipo e il compilatore mostra ogni punto da aggiornare." +- icon: 🚫 + title: Nessun codice morto + desc: "Nessun ramo default irraggiungibile che maschera i bug." +- icon: 📐 + title: Tipi algebrici + desc: "Sealed + record + switch esaustivo = ADT propri in Java." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/language/flexible-constructor-bodies.yaml b/translations/content/it/language/flexible-constructor-bodies.yaml new file mode 100644 index 0000000..2603c0d --- /dev/null +++ b/translations/content/it/language/flexible-constructor-bodies.yaml @@ -0,0 +1,18 @@ +--- +title: Corpi di costruttore flessibili +oldApproach: Valida dopo super() +modernApproach: Codice prima di super() +summary: "Valida e calcola valori prima di chiamare super() o this()." +explanation: "Java 25 rimuove la restrizione che super() debba essere la prima istruzione. Ora puoi validare argomenti, calcolare valori derivati e preparare lo stato prima di delegare al costruttore padre." +whyModernWins: +- icon: 🛡️ + title: Fail fast + desc: "Valida gli argomenti prima che il costruttore della superclasse venga eseguito." +- icon: 🧮 + title: Calcola prima + desc: "Deriva valori e prepara i dati prima di chiamare super()." +- icon: 🧹 + title: Nessun workaround + desc: "Niente più metodi helper statici o factory pattern per aggirare la restrizione." +support: + description: "Finalizzato nel JDK 25 LTS (JEP 513, settembre 2025)." diff --git a/translations/content/it/language/guarded-patterns.yaml b/translations/content/it/language/guarded-patterns.yaml new file mode 100644 index 0000000..598629c --- /dev/null +++ b/translations/content/it/language/guarded-patterns.yaml @@ -0,0 +1,18 @@ +--- +title: Pattern con guardia tramite when +oldApproach: if annidato +modernApproach: Clausola when +summary: "Aggiungi condizioni ai case del pattern usando le guardie when." +explanation: "I pattern con guardia permettono di affinare una corrispondenza di tipo con una condizione booleana aggiuntiva. Questo mantiene tutta la logica di branching nello switch invece di annidare istruzioni if all'interno dei case." +whyModernWins: +- icon: 🎯 + title: Corrispondenza precisa + desc: "Combina tipo + condizione in un'unica etichetta case." +- icon: 📐 + title: Struttura piatta + desc: "Nessun if/else annidato all'interno dei case dello switch." +- icon: 📖 + title: Intento leggibile + desc: "La clausola when si legge come linguaggio naturale." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/language/markdown-javadoc-comments.yaml b/translations/content/it/language/markdown-javadoc-comments.yaml new file mode 100644 index 0000000..85ddbc8 --- /dev/null +++ b/translations/content/it/language/markdown-javadoc-comments.yaml @@ -0,0 +1,18 @@ +--- +title: Markdown nei commenti Javadoc +oldApproach: Javadoc basato su HTML +modernApproach: Javadoc Markdown +summary: "Scrivi commenti Javadoc in Markdown invece di HTML per una migliore leggibilità." +explanation: "Java 23 introduce i commenti Javadoc in stile Markdown con /// come alternativa al formato tradizionale /** */ basato su HTML. La sintassi Markdown è più naturale da scrivere e leggere, con supporto per blocchi di codice, enfasi, liste e link. Il compilatore converte il Markdown in HTML per l'output javadoc." +whyModernWins: +- icon: 📖 + title: Sintassi naturale + desc: "Usa i backtick per il codice inline e ``` per i blocchi invece dei tag HTML." +- icon: ✍️ + title: Più facile da scrivere + desc: "Nessun bisogno di {@code},
, tag 

— scrivi semplicemente Markdown." +- icon: 👁 + title: Migliore negli editor + desc: "Il Markdown viene renderizzato splendidamente nei moderni IDE e editor di testo." +support: + description: "Disponibile dal JDK 23 (settembre 2024)" diff --git a/translations/content/it/language/module-import-declarations.yaml b/translations/content/it/language/module-import-declarations.yaml new file mode 100644 index 0000000..ac1248b --- /dev/null +++ b/translations/content/it/language/module-import-declarations.yaml @@ -0,0 +1,18 @@ +--- +title: Dichiarazioni di importazione modulo +oldApproach: Molte importazioni +modernApproach: import module +summary: "Importa tutti i package esportati da un modulo con una singola dichiarazione." +explanation: "Le dichiarazioni di importazione modulo permettono di importare tutto ciò che un modulo esporta con una riga. Particolarmente utile per java.base che copre collezioni, I/O, stream e altro." +whyModernWins: +- icon: 🧹 + title: Una riga + desc: "Sostituisci un muro di importazioni con una singola importazione modulo." +- icon: 📦 + title: Consapevole dei moduli + desc: "Sfrutta il sistema di moduli per importare insiemi coerenti di package." +- icon: 🚀 + title: Avvio rapido + desc: "Perfetto per script e prototipi dove le liste di importazioni sono noiose." +support: + description: "Finalizzato nel JDK 25 LTS (JEP 511, settembre 2025)." diff --git a/translations/content/it/language/pattern-matching-instanceof.yaml b/translations/content/it/language/pattern-matching-instanceof.yaml new file mode 100644 index 0000000..56316e7 --- /dev/null +++ b/translations/content/it/language/pattern-matching-instanceof.yaml @@ -0,0 +1,18 @@ +--- +title: Pattern matching per instanceof +oldApproach: instanceof + Cast +modernApproach: Variabile pattern +summary: "Combina il controllo del tipo e il cast in un unico passo con il pattern matching." +explanation: "Il pattern matching per instanceof elimina il cast ridondante dopo un controllo del tipo. La variabile è automaticamente scoped dove il pattern corrisponde, rendendo il codice più sicuro e conciso." +whyModernWins: +- icon: 🔄 + title: Nessun cast ridondante + desc: "Il controllo del tipo e il binding della variabile avvengono in un'unica espressione." +- icon: 📏 + title: Meno righe + desc: "Una riga invece di due — la riga del cast sparisce completamente." +- icon: 🛡️ + title: Scope sicuro + desc: "La variabile pattern è nello scope solo dove il tipo è garantito." +support: + description: Ampiamente disponibile dal JDK 16 (marzo 2021) diff --git a/translations/content/it/language/pattern-matching-switch.yaml b/translations/content/it/language/pattern-matching-switch.yaml new file mode 100644 index 0000000..be48672 --- /dev/null +++ b/translations/content/it/language/pattern-matching-switch.yaml @@ -0,0 +1,18 @@ +--- +title: Pattern matching in switch +oldApproach: Catena if-else +modernApproach: Pattern di tipo +summary: "Sostituisci le catene if-else instanceof con pattern di tipo switch puliti." +explanation: "Il pattern matching in switch permette di corrispondere direttamente sui tipi, combinando il test del tipo, il cast e il binding in un'unica etichetta case concisa. Il compilatore verifica la completezza." +whyModernWins: +- icon: 📐 + title: Dispatch strutturato + desc: "Lo switch rende la struttura di branching esplicita e scansionabile." +- icon: 🎯 + title: Forma espressione + desc: "Restituisce un valore direttamente — nessuna variabile mutabile necessaria." +- icon: ✅ + title: Esaustività + desc: "Il compilatore verifica che tutti i tipi siano gestiti." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/language/primitive-types-in-patterns.yaml b/translations/content/it/language/primitive-types-in-patterns.yaml new file mode 100644 index 0000000..7b9ff35 --- /dev/null +++ b/translations/content/it/language/primitive-types-in-patterns.yaml @@ -0,0 +1,18 @@ +--- +title: Tipi primitivi nei pattern +oldApproach: Controlli manuali degli intervalli +modernApproach: Pattern primitivi +summary: "Il pattern matching ora funziona anche con i tipi primitivi, non solo gli oggetti." +explanation: "Java 25 estende il pattern matching ai tipi primitivi. Puoi usare int, long, double ecc. nei pattern switch con guardie when, eliminando la necessità di boxing o controlli manuali degli intervalli." +whyModernWins: +- icon: 📦 + title: Nessun boxing + desc: "Corrisponde ai primitivi direttamente — nessun wrapper Integer necessario." +- icon: 🎯 + title: Coerenza dei pattern + desc: "Stessa sintassi dei pattern per oggetti e primitivi." +- icon: ⚡ + title: Prestazioni migliori + desc: "Evita l'overhead dell'autoboxing nel pattern matching." +support: + description: "Anteprima nel JDK 25 (terza anteprima, JEP 507). Richiede --enable-preview." diff --git a/translations/content/it/language/private-interface-methods.yaml b/translations/content/it/language/private-interface-methods.yaml new file mode 100644 index 0000000..278c871 --- /dev/null +++ b/translations/content/it/language/private-interface-methods.yaml @@ -0,0 +1,18 @@ +--- +title: Metodi privati nelle interfacce +oldApproach: Logica duplicata +modernApproach: Metodi privati +summary: "Estrai la logica condivisa nelle interfacce usando metodi privati." +explanation: "Java 9 consente i metodi privati nelle interfacce, permettendo di condividere codice tra i metodi default senza esporre i dettagli di implementazione alle classi implementanti." +whyModernWins: +- icon: 🧩 + title: Riutilizzo del codice + desc: "Condividi la logica tra i metodi default senza duplicazione." +- icon: 🔐 + title: Incapsulamento + desc: "I dettagli di implementazione rimangono nascosti alle classi implementanti." +- icon: 🧹 + title: Interfacce DRY + desc: "Niente più copia-incolla tra i metodi default." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/language/record-patterns.yaml b/translations/content/it/language/record-patterns.yaml new file mode 100644 index 0000000..1a9ed83 --- /dev/null +++ b/translations/content/it/language/record-patterns.yaml @@ -0,0 +1,18 @@ +--- +title: Pattern record (destrutturazione) +oldApproach: Accesso manuale +modernApproach: Destrutturazione +summary: "Destruttua i record direttamente nei pattern — estrai i campi in un unico passo." +explanation: "I pattern record permettono di decomporre i componenti di un record direttamente in instanceof e switch. Sono supportati anche i pattern annidati, abilitando il matching profondo senza variabili intermedie." +whyModernWins: +- icon: 🎯 + title: Estrazione diretta + desc: "Accedi ai componenti del record senza chiamare manualmente gli accessori." +- icon: 🪆 + title: Annidabile + desc: "I pattern possono annidarsi — corrisponde ai record interni in un'unica espressione." +- icon: 📏 + title: Codice compatto + desc: "Cinque righe diventano due — meno cerimonia, stessa chiarezza." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/language/records-for-data-classes.yaml b/translations/content/it/language/records-for-data-classes.yaml new file mode 100644 index 0000000..81b2261 --- /dev/null +++ b/translations/content/it/language/records-for-data-classes.yaml @@ -0,0 +1,18 @@ +--- +title: Record per classi di dati +oldApproach: POJO verboso +modernApproach: record +summary: "Una riga sostituisce oltre 30 righe di codice boilerplate per i data carrier immutabili." +explanation: "I record generano automaticamente il costruttore, gli accessori (x(), y()), equals(), hashCode() e toString(). Sono immutabili per design e ideali per DTO, value object e pattern matching." +whyModernWins: +- icon: ⚡ + title: Definizione in una riga + desc: "Una singola riga sostituisce costruttore, getter, equals, hashCode, toString." +- icon: 🔒 + title: Immutabile per default + desc: "Tutti i campi sono final — nessun setter pericoloso." +- icon: 🧩 + title: Pattern-friendly + desc: "I record funzionano con i pattern di destrutturazione in switch e instanceof." +support: + description: Ampiamente disponibile dal JDK 16 (marzo 2021) diff --git a/translations/content/it/language/sealed-classes.yaml b/translations/content/it/language/sealed-classes.yaml new file mode 100644 index 0000000..cc5f5ac --- /dev/null +++ b/translations/content/it/language/sealed-classes.yaml @@ -0,0 +1,18 @@ +--- +title: Classi sealed per gerarchie di tipi +oldApproach: Gerarchia aperta +modernApproach: sealed permits +summary: "Limita le classi che possono estendere un tipo — abilitando switch esaustivi." +explanation: "Le classi sealed definiscono un insieme chiuso di sottotipi. Il compilatore conosce tutti i casi possibili, abilitando il pattern matching esaustivo senza un ramo default. Combinate con i record, modellano i tipi di dati algebrici." +whyModernWins: +- icon: 🔐 + title: Gerarchia controllata + desc: "Solo i sottotipi consentiti possono estendere — nessuna sottoclasse a sorpresa." +- icon: ✅ + title: Matching esaustivo + desc: "Il compilatore verifica che lo switch copra tutti i casi, senza default necessario." +- icon: 📐 + title: Tipi di dati algebrici + desc: "Modella i tipi somma in modo naturale — sealed + record = ADT in Java." +support: + description: Ampiamente disponibile dal JDK 17 LTS (settembre 2021) diff --git a/translations/content/it/language/static-members-in-inner-classes.yaml b/translations/content/it/language/static-members-in-inner-classes.yaml new file mode 100644 index 0000000..bf66106 --- /dev/null +++ b/translations/content/it/language/static-members-in-inner-classes.yaml @@ -0,0 +1,18 @@ +--- +title: Membri statici nelle classi interne +oldApproach: Necessaria la classe nested statica +modernApproach: Membri statici nelle classi interne +summary: "Definisci membri statici nelle classi interne senza richiedere classi nested statiche." +explanation: "Prima di Java 16, solo le classi nested statiche potevano contenere membri statici. Le classi interne (non statiche) non potevano avere statici perché richiedevano un'istanza di enclosing. Java 16 allenta questa restrizione, permettendo campi statici, metodi e anche tipi nested nelle classi interne." +whyModernWins: +- icon: 🔓 + title: Più flessibilità + desc: "Le classi interne ora possono avere membri statici quando necessario." +- icon: 🧩 + title: Stato condiviso + desc: "Traccia lo stato condiviso tra le istanze di una classe interna." +- icon: 📐 + title: Libertà di design + desc: "Non è necessario promuovere a classe nested statica solo per un campo statico." +support: + description: Ampiamente disponibile dal JDK 16 (marzo 2021) diff --git a/translations/content/it/language/static-methods-in-interfaces.yaml b/translations/content/it/language/static-methods-in-interfaces.yaml new file mode 100644 index 0000000..7f73487 --- /dev/null +++ b/translations/content/it/language/static-methods-in-interfaces.yaml @@ -0,0 +1,18 @@ +--- +title: Metodi statici nelle interfacce +oldApproach: Classi di utilità +modernApproach: Metodi statici nelle interfacce +summary: "Aggiungi metodi di utilità statici direttamente nelle interfacce invece di classi di utilità separate." +explanation: "Prima di Java 8, i metodi di utilità correlati a un'interfaccia dovevano trovarsi in una classe separata (es. Collections per Collection). I metodi statici nelle interfacce permettono di tenere le utilità correlate insieme. Comune nelle API moderne come Comparator.comparing(), Stream.of() e List.of()." +whyModernWins: +- icon: 📦 + title: Migliore organizzazione + desc: "Tieni le utilità correlate con l'interfaccia, non in una classe separata." +- icon: 🔍 + title: Rilevabilità + desc: "I metodi factory e helper si trovano dove te li aspetti." +- icon: 🧩 + title: Coesione dell'API + desc: "Nessun bisogno di classi *Utils o *Helper separate." +support: + description: "Disponibile dal JDK 8 (marzo 2014)" diff --git a/translations/content/it/language/switch-expressions.yaml b/translations/content/it/language/switch-expressions.yaml new file mode 100644 index 0000000..4ae3ec4 --- /dev/null +++ b/translations/content/it/language/switch-expressions.yaml @@ -0,0 +1,18 @@ +--- +title: Espressioni switch +oldApproach: Istruzione switch +modernApproach: Espressione switch +summary: "Switch come espressione che restituisce un valore — niente break, niente fall-through." +explanation: "Le espressioni switch restituiscono un valore direttamente, usano la sintassi a freccia per prevenire i bug da fall-through, e il compilatore verifica l'esaustività. Questo sostituisce la forma a istruzione soggetta a errori." +whyModernWins: +- icon: 🎯 + title: Restituisce un valore + desc: "Assegna direttamente il risultato dello switch — nessuna variabile temporanea necessaria." +- icon: 🛡️ + title: Nessun fall-through + desc: "La sintassi a freccia elimina i bug da fall-through accidentale per break mancanti." +- icon: ✅ + title: Verifica di esaustività + desc: "Il compilatore verifica che tutti i casi siano coperti." +support: + description: Ampiamente disponibile dal JDK 14 (marzo 2020) diff --git a/translations/content/it/language/text-blocks-for-multiline-strings.yaml b/translations/content/it/language/text-blocks-for-multiline-strings.yaml new file mode 100644 index 0000000..3c6825a --- /dev/null +++ b/translations/content/it/language/text-blocks-for-multiline-strings.yaml @@ -0,0 +1,18 @@ +--- +title: Text block per stringhe multiriga +oldApproach: Concatenazione di stringhe +modernApproach: Text Block +summary: "Scrivi stringhe multiriga in modo naturale con i text block delimitati da triple virgolette." +explanation: "I text block permettono di scrivere stringhe multiriga esattamente come appaiono. Non serve più eseguire l'escape delle virgolette o aggiungere \n. Il compilatore rimuove automaticamente l'indentazione superflua." +whyModernWins: +- icon: 📖 + title: Leggibile com'è + desc: "JSON, SQL e HTML appaiono come vero JSON, SQL e HTML nel codice sorgente." +- icon: 🚫 + title: Nessun escape infernale + desc: "Le virgolette incorporate non richiedono il backslash di escape." +- icon: 📐 + title: Indentazione intelligente + desc: "Gli spazi iniziali vengono rimossi automaticamente in base alla posizione del delimitatore di chiusura." +support: + description: Ampiamente disponibile dal JDK 15 (settembre 2020) diff --git a/translations/content/it/language/type-inference-with-var.yaml b/translations/content/it/language/type-inference-with-var.yaml new file mode 100644 index 0000000..9ec63a7 --- /dev/null +++ b/translations/content/it/language/type-inference-with-var.yaml @@ -0,0 +1,18 @@ +--- +title: Inferenza di tipo con var +oldApproach: Tipi espliciti +modernApproach: Parola chiave var +summary: "Usa var per l'inferenza di tipo nelle variabili locali — meno rumore, stessa sicurezza." +explanation: "Da Java 10, il compilatore inferisce i tipi delle variabili locali dal lato destro dell'assegnazione. Questo riduce il rumore visivo senza sacrificare la sicurezza dei tipi. Usa var quando il tipo è ovvio dal contesto." +whyModernWins: +- icon: ⚡ + title: Meno codice ripetitivo + desc: "Non è necessario ripetere tipi generici complessi su entrambi i lati dell'assegnazione." +- icon: 👁 + title: Migliore leggibilità + desc: "Concentrati sui nomi delle variabili e i valori, non sulle dichiarazioni di tipo." +- icon: 🔒 + title: Ancora type-safe + desc: Il compilatore inferisce e applica il tipo esatto in fase di compilazione. +support: + description: Ampiamente disponibile dal JDK 10 (marzo 2018) diff --git a/translations/content/it/language/unnamed-variables.yaml b/translations/content/it/language/unnamed-variables.yaml new file mode 100644 index 0000000..ceabfc6 --- /dev/null +++ b/translations/content/it/language/unnamed-variables.yaml @@ -0,0 +1,18 @@ +--- +title: Variabili senza nome con _ +oldApproach: Variabile non utilizzata +modernApproach: Segnaposto _ +summary: "Usa _ per segnalare l'intento quando una variabile è intenzionalmente non utilizzata." +explanation: "Le variabili senza nome comunicano a lettori e strumenti che un valore viene deliberatamente ignorato. Niente più convenzioni di naming come 'ignored' o 'unused', niente più avvisi IDE." +whyModernWins: +- icon: 📢 + title: Intento chiaro + desc: "_ dice esplicitamente 'questo valore non è necessario qui'." +- icon: 🔇 + title: Nessun avviso + desc: "IDE e linter non segnaleranno variabili intenzionalmente non utilizzate." +- icon: 🧹 + title: Lambda più pulite + desc: "Le lambda multi-parametro sono più pulite quando si usano solo alcuni parametri." +support: + description: "Finalizzato nel JDK 22 (JEP 456, marzo 2024)." diff --git a/translations/content/it/security/key-derivation-functions.yaml b/translations/content/it/security/key-derivation-functions.yaml new file mode 100644 index 0000000..b455b4d --- /dev/null +++ b/translations/content/it/security/key-derivation-functions.yaml @@ -0,0 +1,18 @@ +--- +title: Funzioni di derivazione delle chiavi +oldApproach: PBKDF2 manuale +modernApproach: API KDF +summary: "Deriva chiavi crittografiche usando l'API KDF standard." +explanation: "L'API KDF fornisce un'interfaccia standard per le funzioni di derivazione delle chiavi incluso HKDF. Sostituisce il goffo pattern SecretKeyFactory + PBEKeySpec con una pulita API builder." +whyModernWins: +- icon: 📐 + title: API pulita + desc: "Pattern builder invece degli goffi costruttori KeySpec." +- icon: 🔧 + title: Supporto HKDF + desc: "Algoritmo HKDF moderno insieme a PBKDF2." +- icon: 🛡️ + title: Standard + desc: "API unificata per tutti gli algoritmi di derivazione delle chiavi." +support: + description: "Finalizzato nel JDK 25 LTS (JEP 510, settembre 2025)." diff --git a/translations/content/it/security/pem-encoding.yaml b/translations/content/it/security/pem-encoding.yaml new file mode 100644 index 0000000..ebe0480 --- /dev/null +++ b/translations/content/it/security/pem-encoding.yaml @@ -0,0 +1,18 @@ +--- +title: Codifica/decodifica PEM +oldApproach: Base64 manuale + Header +modernApproach: API PEM +summary: "Codifica e decodifica oggetti crittografici in formato PEM in modo nativo." +explanation: "L'API PEM fornisce codifica/decodifica standard per certificati, chiavi e altri oggetti crittografici in formato PEM. Niente più wrapping Base64 manuale con header BEGIN/END." +whyModernWins: +- icon: 🧹 + title: Nessun Base64 manuale + desc: "Header PEM, wrapping di riga e Base64 gestiti automaticamente." +- icon: 🔄 + title: Bidirezionale + desc: "Codifica in PEM e decodifica da PEM con un'unica API." +- icon: 🛡️ + title: Formato standard + desc: "Produce output PEM conforme a RFC 7468." +support: + description: "Anteprima nel JDK 25 (JEP 470). Richiede --enable-preview." diff --git a/translations/content/it/security/random-generator.yaml b/translations/content/it/security/random-generator.yaml new file mode 100644 index 0000000..a4c5013 --- /dev/null +++ b/translations/content/it/security/random-generator.yaml @@ -0,0 +1,18 @@ +--- +title: Interfaccia RandomGenerator +oldApproach: new Random() / ThreadLocalRandom +modernApproach: Factory RandomGenerator +summary: "Usa l'interfaccia RandomGenerator per scegliere gli algoritmi di numeri casuali per nome senza accoppiamento a una classe specifica." +explanation: "JDK 17 ha introdotto RandomGenerator come interfaccia comune per tutte le implementazioni RNG. Invece di codificare direttamente new Random() o ThreadLocalRandom, puoi selezionare gli algoritmi per nome tramite una factory, rendendo facile passare tra algoritmi ottimizzati per diversi casi d'uso (velocità, qualità statistica, divisibilità)." +whyModernWins: +- icon: 🔧 + title: Algoritmo-agnostico + desc: "Scegli il miglior algoritmo RNG per nome senza cambiare la struttura del codice." +- icon: ⚡ + title: Algoritmi migliori + desc: "Accesso ai moderni generatori LXM con proprietà statistiche superiori." +- icon: 🔗 + title: API unificata + desc: "Un'interfaccia copre Random, ThreadLocalRandom, SplittableRandom e altro." +support: + description: "Disponibile dal JDK 17 (settembre 2021, JEP 356)." diff --git a/translations/content/it/security/strong-random.yaml b/translations/content/it/security/strong-random.yaml new file mode 100644 index 0000000..c1aa0a2 --- /dev/null +++ b/translations/content/it/security/strong-random.yaml @@ -0,0 +1,18 @@ +--- +title: Generazione di numeri casuali sicuri +oldApproach: new SecureRandom() +modernApproach: getInstanceStrong() +summary: "Ottieni l'implementazione SecureRandom più forte della piattaforma." +explanation: "getInstanceStrong() restituisce l'implementazione SecureRandom configurata come la più forte sulla piattaforma. Questo è controllato dalla proprietà di sicurezza securerandom.strongAlgorithms." +whyModernWins: +- icon: 🛡️ + title: La più forte disponibile + desc: "Seleziona automaticamente il miglior algoritmo per la piattaforma." +- icon: 📖 + title: Intento esplicito + desc: "Comunica chiaramente che è richiesta la casualità forte." +- icon: 🔧 + title: Configurabile + desc: "Gli amministratori possono cambiare l'algoritmo forte tramite le proprietà di sicurezza." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/security/tls-default.yaml b/translations/content/it/security/tls-default.yaml new file mode 100644 index 0000000..c70cc9c --- /dev/null +++ b/translations/content/it/security/tls-default.yaml @@ -0,0 +1,18 @@ +--- +title: TLS 1.3 per default +oldApproach: Configurazione TLS manuale +modernApproach: TLS 1.3 predefinito +summary: "TLS 1.3 è abilitato per default — nessuna configurazione esplicita del protocollo necessaria." +explanation: "Java 11 ha aggiunto il supporto TLS 1.3 e lo ha reso il protocollo preferito. HttpClient lo usa automaticamente. Niente più specifiche manuali delle versioni del protocollo per le connessioni sicure." +whyModernWins: +- icon: 🛡️ + title: Più sicuro + desc: "TLS 1.3 rimuove le suite di cifratura obsolete e i pattern di handshake." +- icon: ⚡ + title: Handshake più veloce + desc: "TLS 1.3 completa in un round trip invece di due." +- icon: 🆓 + title: Zero configurazione + desc: "Sicuro per default — nessuna selezione esplicita del protocollo necessaria." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/content/it/streams/collectors-flatmapping.yaml b/translations/content/it/streams/collectors-flatmapping.yaml new file mode 100644 index 0000000..6428dcf --- /dev/null +++ b/translations/content/it/streams/collectors-flatmapping.yaml @@ -0,0 +1,18 @@ +--- +title: Collectors.flatMapping() +oldApproach: flatMap annidato +modernApproach: flatMapping() +summary: "Usa flatMapping() per appiattire all'interno di un collector di raggruppamento." +explanation: "Collectors.flatMapping() applica una mappatura uno-a-molti come collector downstream. È l'equivalente collector di Stream.flatMap() — utile all'interno di groupingBy o partitioningBy." +whyModernWins: +- icon: 🧩 + title: Componibile + desc: "Funziona come collector downstream all'interno di groupingBy." +- icon: 📐 + title: Un passaggio + desc: "Appiattisci e raggruppa in un'unica traversata dello stream." +- icon: 🔗 + title: Annidabile + desc: "Combina con altri collector downstream." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/streams/optional-ifpresentorelse.yaml b/translations/content/it/streams/optional-ifpresentorelse.yaml new file mode 100644 index 0000000..5f04bc4 --- /dev/null +++ b/translations/content/it/streams/optional-ifpresentorelse.yaml @@ -0,0 +1,18 @@ +--- +title: Optional.ifPresentOrElse() +oldApproach: if/else su Optional +modernApproach: ifPresentOrElse() +summary: "Gestisci entrambi i casi di Optional presente e vuoto in una chiamata." +explanation: "ifPresentOrElse() accetta un Consumer per il caso presente e un Runnable per il caso vuoto. Evita l'anti-pattern isPresent/get." +whyModernWins: +- icon: 📏 + title: Espressione singola + desc: "Entrambi i casi gestiti in una singola chiamata a metodo." +- icon: 🚫 + title: Nessun get() + desc: "Elimina il pericoloso pattern isPresent() + get()." +- icon: 🔗 + title: Fluente + desc: "Si concatena naturalmente dopo findUser() o qualsiasi metodo che restituisce Optional." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/streams/optional-or.yaml b/translations/content/it/streams/optional-or.yaml new file mode 100644 index 0000000..2688d06 --- /dev/null +++ b/translations/content/it/streams/optional-or.yaml @@ -0,0 +1,18 @@ +--- +title: Fallback Optional.or() +oldApproach: Fallback annidato +modernApproach: Catena .or() +summary: "Concatena i fallback Optional senza controlli annidati." +explanation: "Optional.or() restituisce l'Optional originale se ha un valore, altrimenti valuta il supplier per ottenere un Optional alternativo. I supplier sono lazy — chiamati solo quando necessario." +whyModernWins: +- icon: 🔗 + title: Concatenabile + desc: "Impila i fallback in una pipeline leggibile." +- icon: ⚡ + title: Valutazione lazy + desc: "I supplier di fallback vengono eseguiti solo se necessario." +- icon: 📖 + title: Dichiarativo + desc: "Si legge come 'prova il primario, o il secondario, o i default'." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/streams/predicate-not.yaml b/translations/content/it/streams/predicate-not.yaml new file mode 100644 index 0000000..9c614c4 --- /dev/null +++ b/translations/content/it/streams/predicate-not.yaml @@ -0,0 +1,18 @@ +--- +title: Predicate.not() per la negazione +oldApproach: Negazione lambda +modernApproach: Predicate.not() +summary: "Usa Predicate.not() per negare i riferimenti a metodo in modo pulito invece di scrivere wrapper lambda." +explanation: "Prima di Java 11, negare un riferimento a metodo richiedeva di avvolgerlo in una lambda. Predicate.not() permette di negare qualsiasi predicato direttamente, mantenendo il codice leggibile e coerente con lo stile dei riferimenti a metodo in tutta la pipeline stream." +whyModernWins: +- icon: 👁 + title: Negazione più pulita + desc: "Non è necessario avvolgere i riferimenti a metodo in lambda solo per negarli." +- icon: 🔗 + title: Componibile + desc: "Funziona con qualsiasi Predicate, abilitando catene di predicati pulite." +- icon: 📖 + title: Lettura naturale + desc: "Predicate.not(String::isBlank) si legge come in inglese." +support: + description: "Disponibile dal JDK 11 (settembre 2018)." diff --git a/translations/content/it/streams/stream-gatherers.yaml b/translations/content/it/streams/stream-gatherers.yaml new file mode 100644 index 0000000..d932bc1 --- /dev/null +++ b/translations/content/it/streams/stream-gatherers.yaml @@ -0,0 +1,18 @@ +--- +title: Stream gatherer +oldApproach: Collector personalizzato +modernApproach: gather() +summary: "Usa i gatherer per operazioni stream intermedie personalizzate." +explanation: "I gatherer sono una nuova operazione stream intermedia che può esprimere trasformazioni complesse come finestre scorrevoli, gruppi di dimensioni fisse e operazioni di scansione che erano impossibili con le operazioni stream standard." +whyModernWins: +- icon: 🧩 + title: Componibile + desc: "I gatherer si compongono con altre operazioni stream." +- icon: 📦 + title: Operazioni integrate + desc: "windowFixed, windowSliding, fold, scan pronti all'uso." +- icon: 🔧 + title: Estensibile + desc: "Scrivi gatherer personalizzati per qualsiasi trasformazione intermedia." +support: + description: "Finalizzato nel JDK 24 (JEP 485, marzo 2025)." diff --git a/translations/content/it/streams/stream-iterate-predicate.yaml b/translations/content/it/streams/stream-iterate-predicate.yaml new file mode 100644 index 0000000..f3cd9ea --- /dev/null +++ b/translations/content/it/streams/stream-iterate-predicate.yaml @@ -0,0 +1,18 @@ +--- +title: Stream.iterate() con predicato +oldApproach: iterate + limit +modernApproach: iterate(seed, pred, op) +summary: "Usa un predicato per fermare l'iterazione — come un ciclo for in forma stream." +explanation: "Il tre-argomenti Stream.iterate(seed, hasNext, next) funziona come un ciclo for: seed è l'inizio, hasNext determina quando fermarsi e next produce il valore successivo." +whyModernWins: +- icon: 🎯 + title: Terminazione naturale + desc: "Fermati in base a una condizione, non a un limite arbitrario." +- icon: 📐 + title: Equivalente al ciclo for + desc: "Stessa semantica di for(seed; hasNext; next)." +- icon: 🛡️ + title: Nessun rischio di stream infinito + desc: "Il predicato garantisce la terminazione." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/streams/stream-mapmulti.yaml b/translations/content/it/streams/stream-mapmulti.yaml new file mode 100644 index 0000000..861870f --- /dev/null +++ b/translations/content/it/streams/stream-mapmulti.yaml @@ -0,0 +1,18 @@ +--- +title: Stream.mapMulti() +oldApproach: flatMap + List +modernApproach: mapMulti() +summary: "Emetti zero o più elementi per input senza creare stream intermedi." +explanation: "mapMulti() è un'alternativa imperativa a flatMap che evita la creazione di oggetti Stream intermedi per ogni elemento. È più efficiente quando la mappatura produce un numero ridotto di elementi." +whyModernWins: +- icon: ⚡ + title: Meno allocazione + desc: "Nessuno Stream intermedio creato per elemento." +- icon: 🎯 + title: Stile imperativo + desc: "Usa loop e condizionali direttamente." +- icon: 📐 + title: Flessibile + desc: "Emetti zero, uno o molti elementi con pieno controllo." +support: + description: Ampiamente disponibile dal JDK 16 (marzo 2021) diff --git a/translations/content/it/streams/stream-of-nullable.yaml b/translations/content/it/streams/stream-of-nullable.yaml new file mode 100644 index 0000000..37333b1 --- /dev/null +++ b/translations/content/it/streams/stream-of-nullable.yaml @@ -0,0 +1,18 @@ +--- +title: Stream.ofNullable() +oldApproach: Controllo null +modernApproach: ofNullable() +summary: "Crea uno stream da zero o un elemento da un valore nullable." +explanation: "Stream.ofNullable() restituisce uno stream a elemento singolo se il valore è non-null, o uno stream vuoto se null. Elimina il pattern di controllo null ternario." +whyModernWins: +- icon: 📏 + title: Conciso + desc: "Una chiamata sostituisce il condizionale ternario." +- icon: 🔗 + title: Adatto a flatMap + desc: "Perfetto all'interno di flatMap per saltare i valori null." +- icon: 🛡️ + title: Null-safe + desc: "Nessun rischio NPE — null diventa stream vuoto." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/streams/stream-takewhile-dropwhile.yaml b/translations/content/it/streams/stream-takewhile-dropwhile.yaml new file mode 100644 index 0000000..22625fa --- /dev/null +++ b/translations/content/it/streams/stream-takewhile-dropwhile.yaml @@ -0,0 +1,18 @@ +--- +title: Stream takeWhile / dropWhile +oldApproach: Loop manuale +modernApproach: takeWhile/dropWhile +summary: "Prendi o scarta elementi da uno stream in base a un predicato." +explanation: "takeWhile() restituisce elementi finché il predicato è vero e si ferma al primo falso. dropWhile() salta gli elementi finché è vero e restituisce il resto. Entrambi funzionano meglio su stream ordinati." +whyModernWins: +- icon: 🎯 + title: Cortocircuito + desc: "Smette di elaborare non appena il predicato fallisce." +- icon: 🔗 + title: Adatto alla pipeline + desc: "Si concatena naturalmente con altre operazioni stream." +- icon: 📖 + title: Dichiarativo + desc: "takeWhile si legge come in inglese: 'prendi mentre meno di 100'." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/streams/stream-tolist.yaml b/translations/content/it/streams/stream-tolist.yaml new file mode 100644 index 0000000..d552618 --- /dev/null +++ b/translations/content/it/streams/stream-tolist.yaml @@ -0,0 +1,18 @@ +--- +title: Stream.toList() +oldApproach: Collectors.toList() +modernApproach: .toList() +summary: "Il terminale toList() sostituisce il verboso collect(Collectors.toList())." +explanation: "Stream.toList() restituisce una lista non modificabile. È equivalente a .collect(Collectors.toUnmodifiableList()) ma molto più breve. Nota: il risultato è immutabile, a differenza di Collectors.toList()." +whyModernWins: +- icon: 📏 + title: 7 caratteri vs 24 + desc: ".toList() sostituisce .collect(Collectors.toList())." +- icon: 🔒 + title: Immutabile + desc: "La lista risultante non può essere modificata." +- icon: 📖 + title: Fluente + desc: "Si legge naturalmente alla fine di una pipeline." +support: + description: Ampiamente disponibile dal JDK 16 (marzo 2021) diff --git a/translations/content/it/streams/virtual-thread-executor.yaml b/translations/content/it/streams/virtual-thread-executor.yaml new file mode 100644 index 0000000..89b0173 --- /dev/null +++ b/translations/content/it/streams/virtual-thread-executor.yaml @@ -0,0 +1,18 @@ +--- +title: Executor con thread virtuali +oldApproach: Pool di thread fisso +modernApproach: Executor con thread virtuali +summary: "Usa gli executor con thread virtuali per concorrenza leggera illimitata." +explanation: "L'executor con thread virtuali crea un nuovo thread virtuale per ogni task. Nessun dimensionamento del pool necessario — i thread virtuali sono abbastanza economici da crearne milioni." +whyModernWins: +- icon: ♾️ + title: Nessun dimensionamento + desc: "Nessuna dimensione del pool da ottimizzare — crea tutti i thread necessari." +- icon: ⚡ + title: Leggero + desc: "I thread virtuali usano KB di memoria, non MB." +- icon: 🧹 + title: Auto-chiudibile + desc: "Il try-with-resources gestisce automaticamente lo shutdown." +support: + description: Ampiamente disponibile dal JDK 21 LTS (settembre 2023) diff --git a/translations/content/it/strings/string-chars-stream.yaml b/translations/content/it/strings/string-chars-stream.yaml new file mode 100644 index 0000000..cfbda26 --- /dev/null +++ b/translations/content/it/strings/string-chars-stream.yaml @@ -0,0 +1,18 @@ +--- +title: Caratteri della stringa come stream +oldApproach: Loop manuale +modernApproach: Stream chars() +summary: "Elabora i caratteri della stringa come pipeline stream." +explanation: "String.chars() restituisce un IntStream di valori carattere, abilitando l'elaborazione funzionale. Per il supporto Unicode, codePoints() gestisce correttamente i caratteri supplementari." +whyModernWins: +- icon: 🔗 + title: Concatenabile + desc: "Usa filter, map, collect sugli stream di caratteri." +- icon: 📐 + title: Dichiarativo + desc: "Descrivi cosa fare, non come fare il loop." +- icon: 🌐 + title: Pronto per Unicode + desc: "codePoints() gestisce correttamente emoji e caratteri supplementari." +support: + description: "Disponibile dal JDK 8+ (migliorato in 9+)" diff --git a/translations/content/it/strings/string-formatted.yaml b/translations/content/it/strings/string-formatted.yaml new file mode 100644 index 0000000..592a52f --- /dev/null +++ b/translations/content/it/strings/string-formatted.yaml @@ -0,0 +1,18 @@ +--- +title: String.formatted() +oldApproach: String.format() +modernApproach: formatted() +summary: "Chiama formatted() sulla stringa template stessa." +explanation: "String.formatted() è un metodo di istanza equivalente a String.format() ma chiamato sulla stringa di formato. Si legge più naturalmente in un flusso da sinistra a destra." +whyModernWins: +- icon: 📖 + title: Si legge naturalmente + desc: "template.formatted(args) scorre meglio di String.format(template, args)." +- icon: 🔗 + title: Concatenabile + desc: "Può essere concatenato con altri metodi string." +- icon: 📏 + title: Meno verboso + desc: "Elimina la ridondante chiamata statica String.format()." +support: + description: Ampiamente disponibile dal JDK 15 (settembre 2020) diff --git a/translations/content/it/strings/string-indent-transform.yaml b/translations/content/it/strings/string-indent-transform.yaml new file mode 100644 index 0000000..f26a075 --- /dev/null +++ b/translations/content/it/strings/string-indent-transform.yaml @@ -0,0 +1,18 @@ +--- +title: String.indent() e transform() +oldApproach: Indentazione manuale +modernApproach: indent() / transform() +summary: "Indenta il testo e concatena le trasformazioni di stringa in modo fluente." +explanation: "indent(n) aggiunge n spazi a ogni riga. transform(fn) applica qualsiasi funzione e restituisce il risultato, abilitando la concatenazione fluente delle operazioni sulle stringhe." +whyModernWins: +- icon: 📏 + title: Integrato + desc: "L'indentazione è un'operazione comune — ora è una chiamata." +- icon: 🔗 + title: Concatenabile + desc: "transform() abilita pipeline fluenti sulle stringhe." +- icon: 🧹 + title: Codice pulito + desc: "Nessuna divisione manuale di righe e loop StringBuilder." +support: + description: Ampiamente disponibile dal JDK 12 (marzo 2019) diff --git a/translations/content/it/strings/string-isblank.yaml b/translations/content/it/strings/string-isblank.yaml new file mode 100644 index 0000000..9feca2c --- /dev/null +++ b/translations/content/it/strings/string-isblank.yaml @@ -0,0 +1,18 @@ +--- +title: String.isBlank() +oldApproach: trim().isEmpty() +modernApproach: isBlank() +summary: "Controlla le stringhe vuote con una singola chiamata a metodo." +explanation: "isBlank() restituisce true se la stringa è vuota o contiene solo spazi bianchi, inclusi i caratteri di spazio bianco Unicode che trim() non riconosce." +whyModernWins: +- icon: 📖 + title: Auto-documentante + desc: "isBlank() dice esattamente cosa controlla." +- icon: 🌐 + title: Consapevole di Unicode + desc: "Gestisce tutti gli spazi bianchi Unicode, non solo ASCII." +- icon: ⚡ + title: Nessuna allocazione + desc: "Non viene creata alcuna stringa trimmed intermedia." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/content/it/strings/string-lines.yaml b/translations/content/it/strings/string-lines.yaml new file mode 100644 index 0000000..305bf91 --- /dev/null +++ b/translations/content/it/strings/string-lines.yaml @@ -0,0 +1,18 @@ +--- +title: String.lines() per la divisione in righe +oldApproach: split("\\n") +modernApproach: lines() +summary: "Usa String.lines() per dividere il testo in uno stream di righe senza overhead regex." +explanation: "String.lines() restituisce uno Stream di righe divise per \n, \r o \r\n. È più lazy ed efficiente di split(), evita la compilazione regex e si integra naturalmente con l'API Stream per ulteriori elaborazioni." +whyModernWins: +- icon: ⚡ + title: Streaming lazy + desc: "Le righe vengono prodotte su richiesta, non tutte in una volta come split()." +- icon: 🔧 + title: Terminatori di riga universali + desc: "Gestisce automaticamente \n, \r e \r\n senza regex." +- icon: 🔗 + title: Integrazione Stream + desc: "Restituisce uno Stream per uso diretto con filter, map, collect." +support: + description: "Disponibile dal JDK 11 (settembre 2018)." diff --git a/translations/content/it/strings/string-repeat.yaml b/translations/content/it/strings/string-repeat.yaml new file mode 100644 index 0000000..c1cd453 --- /dev/null +++ b/translations/content/it/strings/string-repeat.yaml @@ -0,0 +1,18 @@ +--- +title: String.repeat() +oldApproach: Loop StringBuilder +modernApproach: repeat() +summary: "Ripeti una stringa n volte senza un loop." +explanation: "String.repeat(int) restituisce la stringa concatenata con se stessa n volte. Gestisce i casi limite: repeat(0) restituisce una stringa vuota, repeat(1) restituisce la stessa stringa." +whyModernWins: +- icon: 📏 + title: Una riga + desc: "Sostituisci 5 righe di codice StringBuilder con una chiamata." +- icon: ⚡ + title: Ottimizzato + desc: "L'implementazione interna è ottimizzata per le ripetizioni grandi." +- icon: 📖 + title: Intento chiaro + desc: "repeat(3) trasmette immediatamente lo scopo." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/content/it/strings/string-strip.yaml b/translations/content/it/strings/string-strip.yaml new file mode 100644 index 0000000..9721647 --- /dev/null +++ b/translations/content/it/strings/string-strip.yaml @@ -0,0 +1,18 @@ +--- +title: String.strip() vs trim() +oldApproach: trim() +modernApproach: strip() +summary: "Usa stripping consapevole di Unicode con strip(), stripLeading(), stripTrailing()." +explanation: "trim() rimuove solo i caratteri ≤ U+0020 (caratteri di controllo ASCII e spazio). strip() usa Character.isWhitespace() che gestisce gli spazi Unicode come lo spazio unificatore, lo spazio ideografico, ecc." +whyModernWins: +- icon: 🌐 + title: Corretto per Unicode + desc: "Gestisce tutti i caratteri di spazio bianco da ogni script." +- icon: 🎯 + title: Direzionale + desc: "stripLeading() e stripTrailing() per il trimming su un solo lato." +- icon: 🛡️ + title: Meno bug + desc: "Nessun spazio bianco a sorpresa rimasto nel testo internazionale." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/content/it/tooling/aot-class-preloading.yaml b/translations/content/it/tooling/aot-class-preloading.yaml new file mode 100644 index 0000000..555935e --- /dev/null +++ b/translations/content/it/tooling/aot-class-preloading.yaml @@ -0,0 +1,18 @@ +--- +title: Precaricamento AOT delle classi +oldApproach: Avvio a freddo ogni volta +modernApproach: Cache AOT +summary: "Metti in cache il caricamento delle classi e la compilazione per un avvio istantaneo." +explanation: "Il precaricamento AOT delle classi mette in cache le classi caricate e collegate da un'esecuzione di addestramento. Agli avvii successivi, le classi vengono caricate dalla cache, saltando la verifica e il collegamento. Combinato con la compilazione AOT, questo riduce drasticamente il tempo di avvio." +whyModernWins: +- icon: ⚡ + title: Avvio più veloce + desc: "Salta il caricamento, la verifica e il collegamento delle classi." +- icon: 📦 + title: Stato in cache + desc: "L'esecuzione di addestramento cattura lo stato ideale delle classi." +- icon: 🔧 + title: Nessuna modifica al codice + desc: "Funziona con le applicazioni esistenti — basta aggiungere flag JVM." +support: + description: "Disponibile come funzionalità standard nel JDK 25 LTS (JEP 514/515, settembre 2025)." diff --git a/translations/content/it/tooling/built-in-http-server.yaml b/translations/content/it/tooling/built-in-http-server.yaml new file mode 100644 index 0000000..00d10c1 --- /dev/null +++ b/translations/content/it/tooling/built-in-http-server.yaml @@ -0,0 +1,18 @@ +--- +title: Server HTTP integrato +oldApproach: Server esterno / Framework +modernApproach: CLI jwebserver +summary: "Java 18 include un server HTTP minimale integrato per la prototipazione e la servizione di file." +explanation: "JDK 18 ha aggiunto un semplice server HTTP di file senza dipendenze accessibile tramite lo strumento da riga di comando jwebserver o l'API SimpleFileServer. Serve file statici da una directory specifica senza configurazione. Lo strumento CLI è ideale per prototipazione rapida, test e condivisione di file ad hoc — nessuna dipendenza esterna o framework richiesto." +whyModernWins: +- icon: 🚀 + title: Zero setup + desc: "Esegui jwebserver in qualsiasi directory — nessuna installazione, configurazione o dipendenza necessaria." +- icon: 📦 + title: Integrato nel JDK + desc: "Disponibile in ogni installazione JDK 18+, sempre disponibile su qualsiasi macchina con Java." +- icon: 🧪 + title: Ottimo per la prototipazione + desc: "Servi file statici istantaneamente per testare HTML, API o sviluppo front-end." +support: + description: "Disponibile dal JDK 18 (marzo 2022)" diff --git a/translations/content/it/tooling/compact-object-headers.yaml b/translations/content/it/tooling/compact-object-headers.yaml new file mode 100644 index 0000000..8ca040c --- /dev/null +++ b/translations/content/it/tooling/compact-object-headers.yaml @@ -0,0 +1,18 @@ +--- +title: Header oggetto compatti +oldApproach: Header a 128 bit +modernApproach: Header a 64 bit +summary: "Riduci della metà la dimensione dell'header degli oggetti per una migliore densità di memoria e utilizzo della cache." +explanation: "Gli header oggetto compatti riducono l'overhead per oggetto da 128 bit a 64 bit sulle piattaforme a 64 bit. Questo risparmia memoria e migliora l'utilizzo della cache, specialmente per le applicazioni con molti oggetti piccoli." +whyModernWins: +- icon: 📦 + title: Header più piccoli del 50% + desc: "8 byte invece di 16 per oggetto." +- icon: ⚡ + title: Migliore utilizzo della cache + desc: "Più oggetti entrano nelle linee di cache della CPU." +- icon: 📊 + title: Maggiore densità + desc: "Più oggetti nello stesso heap." +support: + description: "Finalizzato nel JDK 25 LTS (JEP 519, settembre 2025)." diff --git a/translations/content/it/tooling/jfr-profiling.yaml b/translations/content/it/tooling/jfr-profiling.yaml new file mode 100644 index 0000000..94a42c3 --- /dev/null +++ b/translations/content/it/tooling/jfr-profiling.yaml @@ -0,0 +1,18 @@ +--- +title: JFR per il profiling +oldApproach: Profiler esterno +modernApproach: Java Flight Recorder +summary: "Profila qualsiasi app Java con il Flight Recorder integrato — nessuno strumento esterno." +explanation: "Java Flight Recorder (JFR) è uno strumento di profiling a basso overhead integrato nella JVM. Cattura eventi per CPU, memoria, GC, I/O, thread e eventi personalizzati con impatto minimo sulle prestazioni (~1%)." +whyModernWins: +- icon: 🆓 + title: Integrato + desc: "Nessun profiler esterno da installare o licenziare." +- icon: ⚡ + title: Basso overhead + desc: "~1% di impatto sulle prestazioni — sicuro per la produzione." +- icon: 📊 + title: Eventi ricchi + desc: "CPU, memoria, GC, thread, I/O, lock ed eventi personalizzati." +support: + description: "Ampiamente disponibile dal JDK 9/11 (open-source in 11)" diff --git a/translations/content/it/tooling/jshell-prototyping.yaml b/translations/content/it/tooling/jshell-prototyping.yaml new file mode 100644 index 0000000..f972877 --- /dev/null +++ b/translations/content/it/tooling/jshell-prototyping.yaml @@ -0,0 +1,18 @@ +--- +title: JShell per la prototipazione +oldApproach: Crea file + Compila + Esegui +modernApproach: REPL jshell +summary: "Prova le espressioni Java in modo interattivo senza creare file." +explanation: "JShell è un Read-Eval-Print Loop per Java. Testa espressioni, sperimenta con le API e prototipa codice senza creare file, compilare o scrivere un metodo main. Include completamento con tab e documentazione inline." +whyModernWins: +- icon: ⚡ + title: Feedback immediato + desc: "Digita un'espressione, vedi il risultato immediatamente." +- icon: 📝 + title: Nessun file necessario + desc: "Nessun file .java, nessun passo di compilazione." +- icon: 🔍 + title: Esplorazione delle API + desc: "Il completamento con tab aiuta a scoprire metodi e parametri." +support: + description: Ampiamente disponibile dal JDK 9 (settembre 2017) diff --git a/translations/content/it/tooling/junit6-with-jspecify.yaml b/translations/content/it/tooling/junit6-with-jspecify.yaml new file mode 100644 index 0000000..a85047f --- /dev/null +++ b/translations/content/it/tooling/junit6-with-jspecify.yaml @@ -0,0 +1,18 @@ +--- +title: JUnit 6 con sicurezza null JSpecify +oldApproach: API non annotata +modernApproach: API @NullMarked +summary: "JUnit 6 adotta JSpecify @NullMarked, rendendo espliciti i contratti null nell'intera API di asserzione." +explanation: "JUnit 5 è stato rilasciato senza annotazioni di nullabilità standardizzate, lasciando agli sviluppatori il compito di indovinare se i parametri di asserzione o i valori di ritorno potessero essere null. JUnit 6 adotta JSpecify nell'intero modulo: l'annotazione @NullMarked rende tutti i tipi non annotati non-null per default, e @Nullable contrassegna le eccezioni. La classe Assertions annota esplicitamente i parametri come assertNull(@Nullable Object actual) e fail(@Nullable String message), così IDE e analizzatori statici possono rilevare l'uso errato del null in fase di compilazione invece che a runtime." +whyModernWins: +- icon: 📜 + title: Contratti espliciti + desc: "@NullMarked sul modulo JUnit 6 documenta la semantica null direttamente nell'API — nessuna lettura del sorgente necessaria." +- icon: 🛡️ + title: Sicurezza in fase di compilazione + desc: "IDE e analizzatori avvisano quando viene passato null dove è atteso non-null, rilevando i bug prima dell'esecuzione dei test." +- icon: 🌐 + title: Standard dell'ecosistema + desc: "JSpecify è adottato da Spring, Guava e altri — semantica null coerente nell'intero stack." +support: + description: "Disponibile da JUnit 6.0 (ottobre 2025, richiede Java 17+)" diff --git a/translations/content/it/tooling/multi-file-source.yaml b/translations/content/it/tooling/multi-file-source.yaml new file mode 100644 index 0000000..632bfdd --- /dev/null +++ b/translations/content/it/tooling/multi-file-source.yaml @@ -0,0 +1,18 @@ +--- +title: Launcher multi-file sorgente +oldApproach: Compila tutto prima +modernApproach: Source Launcher +summary: "Avvia programmi multi-file senza un passo di compilazione esplicito." +explanation: "Java 22+ può compilare automaticamente i file sorgente referenziati quando si avvia da un file .java. Questo rende i piccoli programmi multi-file facili da eseguire come script, senza necessità di Maven o Gradle." +whyModernWins: +- icon: 🚀 + title: Zero setup + desc: "Nessuno strumento di build necessario per piccoli programmi multi-file." +- icon: 🔗 + title: Auto-risoluzione + desc: "Le classi referenziate vengono trovate e compilate automaticamente." +- icon: 📝 + title: Simile a script + desc: "Esegui programmi multi-file come script." +support: + description: "Disponibile dal JDK 22 (marzo 2024)" diff --git a/translations/content/it/tooling/single-file-execution.yaml b/translations/content/it/tooling/single-file-execution.yaml new file mode 100644 index 0000000..a784d4a --- /dev/null +++ b/translations/content/it/tooling/single-file-execution.yaml @@ -0,0 +1,18 @@ +--- +title: Esecuzione di file singoli +oldApproach: Compilazione in due passi +modernApproach: Avvio diretto +summary: "Esegui programmi Java a file singolo direttamente senza javac." +explanation: "Il launcher Java può compilare ed eseguire un singolo file sorgente in un comando. Combinato con il supporto shebang su Unix, i file Java possono funzionare come script. Nessun passo di compilazione separato necessario." +whyModernWins: +- icon: ⚡ + title: Un comando + desc: "java File.java compila ed esegue in un unico passo." +- icon: 📝 + title: Simile a script + desc: "Aggiungi una riga shebang per rendere i file .java script eseguibili." +- icon: 🎓 + title: Adatto all'apprendimento + desc: "I principianti eseguono il codice immediatamente senza imparare gli strumenti di build." +support: + description: Ampiamente disponibile dal JDK 11 (settembre 2018) diff --git a/translations/strings/it.yaml b/translations/strings/it.yaml new file mode 100644 index 0000000..0f9e414 --- /dev/null +++ b/translations/strings/it.yaml @@ -0,0 +1,90 @@ +site: + title: java.evolved + tagline: Java si è evoluto. Anche il tuo codice può. + tagline_line1: Java si è evoluto. + tagline_line2: Anche il tuo codice può. + description: Una raccolta di snippet Java moderni. Ogni vecchio pattern Java accanto + al suo sostituto moderno e pulito — fianco a fianco. + heroSnippetCount: ✦ {{snippetCount}} pattern moderni · Java 8 → Java 25 + heroOld: Vecchio + heroModern: Moderno + allComparisons: Tutti i confronti + snippetsBadge: '{{snippetCount}} snippet' +nav: + allPatterns: ← Tutti i pattern + toggleTheme: Cambia tema + viewOnGitHub: Vedi su GitHub + selectLanguage: Seleziona lingua +breadcrumb: + home: Home +sections: + codeComparison: Confronto Codice + whyModernWins: Perché vince l'approccio moderno + oldApproach: Approccio Vecchio + modernApproach: Approccio Moderno + sinceJdk: Dal JDK + difficulty: Difficoltà + jdkSupport: Supporto JDK + howItWorks: Come funziona + relatedDocs: Documentazione Correlata + relatedPatterns: Pattern correlati +filters: + show: 'Mostra:' + all: Tutti +difficulty: + beginner: Principiante + intermediate: Intermedio + advanced: Avanzato +search: + placeholder: Cerca snippet… + noResults: Nessun risultato trovato. + esc: ESC + searchTrigger: Cerca… + navigate: naviga + open: apri + close: chiudi +cards: + old: Vecchio + modern: Moderno + hoverHint: passa il mouse per vedere il moderno → + hoverHintRelated: Passa il mouse per vedere il moderno ➜ + touchHint: 👆 tocca o scorri → +copy: + copy: Copia + copied: Copiato! +share: + label: Condividi +view: + expandAll: Espandi Tutto + collapseAll: Comprimi Tutto +stats: + modernPatterns: Pattern Moderni + jdkVersions: Versioni JDK Coperte + categories: Categorie + linesOfPython: Righe di Python Richieste +footer: + tagline: Java si è evoluto. Anche il tuo codice può. + madeWith: Fatto con ❤️ da + and: e + inspiredBy: Ispirato da + viewOnGitHub: Vedi su GitHub +copilot: + headline: Modernizza il tuo codice Java con GitHub Copilot. + description: Lascia che Copilot ti aiuti a migrare i pattern legacy a Java moderno + — automaticamente. + appModernization: Modernizzazione App → + javaGuide: Guida Java → +support: + available: Disponibile + preview: Anteprima + experimental: Sperimentale +contribute: + button: Contribuisci + codeIssue: Segnala un problema nel codice + translationIssue: Segnala un problema di traduzione + suggestPattern: Suggerisci un nuovo pattern + seeIssue: "Vedi un problema con questo codice?" + reportIt: "Faccelo sapere." +untranslated: + notice: Questa pagina non è ancora stata tradotta in {{localeName}}. + viewInEnglish: Visualizza in Inglese