È uscito il Corso Java Completo
Torna al blog

Cos'è Java e perché è ancora ovunque

Cos'è Java, come funziona la JVM e il principio scrivi una volta esegui ovunque, dove si usa davvero oggi e quali sono i suoi limiti reali.

Edoardo Midali

Edoardo Midali

Developer · Content Creator

8 min di lettura

Ogni volta che si parla di linguaggi "moderni", qualcuno dichiara che Java è morto. Poi apri gli annunci di lavoro in Italia e Java è nella metà di quelli che parlano di backend. In questo articolo trovi cosa fa davvero Java, perché quel modello di esecuzione è stato rivoluzionario, dove domina ancora oggi e quali sono i suoi limiti onesti.

Cos'è

Java è un linguaggio compilato non in codice macchina ma in bytecode, un formato intermedio che viene eseguito da un programma chiamato JVM (Java Virtual Machine).

È questa doppia natura a spiegare quasi tutto il resto: la portabilità, le prestazioni, l'avvio lento, il consumo di memoria.

Scrivi una volta, esegui ovunque: cosa significa davvero

Lo slogan è del 1995 e oggi suona banale. Non lo era.

Prima di Java, compilare un programma significava produrre un eseguibile legato a una specifica combinazione di processore e sistema operativo. Un programma compilato per Windows su x86 non girava su un server Solaris. Per distribuire su cinque piattaforme dovevi compilare cinque volte, con cinque toolchain diverse, e gestire cinque insiemi di bug specifici.

Java ha spostato il problema. Il compilatore javac non produce istruzioni per il tuo processore, ma per una macchina che non esiste fisicamente:

javac Saluto.java      # produce Saluto.class (bytecode)
java Saluto            # la JVM legge il bytecode e lo esegue

Quel file .class è identico su Windows, Linux e macOS. A essere diversa è la JVM, che viene scritta una volta per ogni piattaforma da chi produce la JVM, non da te. Il lavoro di portabilità è stato fatto una volta per tutti, invece che da ogni singolo sviluppatore.

C'è un secondo effetto, meno pubblicizzato ma altrettanto importante. La JVM non si limita a interpretare il bytecode: lo osserva mentre gira e ricompila in codice macchina nativo le parti eseguite più spesso (si chiama compilazione JIT, just-in-time). Conseguenza pratica: un programma Java parte piano, poi accelera. Su un servizio che resta acceso per settimane, le prestazioni a regime sono vicine a quelle di un linguaggio compilato nativamente.

Come è fatto il linguaggio

Tre caratteristiche, tutte e tre scelte deliberate.

Fortemente e staticamente tipizzato. Ogni variabile ha un tipo dichiarato e il compilatore lo verifica prima che il programma giri. Se passi una stringa dove serve un numero, non compila — non scopri il problema in produzione alle tre di notte.

Orientato agli oggetti fino in fondo. Tutto sta dentro una classe, non esistono funzioni libere: è la programmazione orientata agli oggetti applicata senza scorciatoie.

Verboso per scelta. Su questo vale la pena fermarsi.

public class Ordine {
    private final String cliente;
    private final List<Articolo> articoli;

    public Ordine(String cliente, List<Articolo> articoli) {
        this.cliente = cliente;
        this.articoli = articoli;
    }

    public BigDecimal totale() {
        return articoli.stream()
                .map(Articolo::prezzo)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}

In Python la stessa cosa sarebbe un terzo delle righe. Ma c'è un dato che cambia il giudizio: il codice viene letto molte più volte di quanto venga scritto. Su un sistema bancario mantenuto per vent'anni da persone che si avvicendano, l'esplicito costa un minuto in più oggi e ne risparmia venti fra tre anni a chi apre quel file senza contesto. Per un progetto personale di duecento righe è un peso inutile. Per un gestionale da mezzo milione di righe è il motivo per cui è ancora manutenibile.

Da Java 17 in poi il linguaggio si è comunque accorciato parecchio: var per l'inferenza dei tipi, i record per le classi di soli dati, il pattern matching. La verbosità del 2010 non è quella di oggi.

Dove domina davvero

AmbitoPerché Java
Banche e assicurazioniSistemi che devono girare per decenni, transazioni, audit, regole di conformità
Pubblica amministrazioneFornitori consolidati, vincoli di gara, sistemi legacy da integrare
AndroidLa piattaforma è nata su Java; oggi Kotlin è preferito ma gira sulla stessa base
Big dataHadoop, Spark, Kafka, Elasticsearch: l'infrastruttura dei dati è scritta in Java o Scala
Backend enterpriseSpring Boot è lo standard di fatto per le API REST aziendali

Un dettaglio che sfugge: anche chi non scrive Java spesso usa Java. Se il tuo team fa streaming di eventi con Kafka o cerca dentro Elasticsearch, sotto c'è una JVM da configurare.

Perché le aziende lo scelgono

Non è nostalgia, sono tre ragioni concrete.

La compatibilità all'indietro è quasi maniacale. Codice compilato dieci anni fa in genere gira ancora sulla JVM di oggi. Per un'azienda con centinaia di applicazioni interne, questo significa poter aggiornare la piattaforma senza riscrivere tutto. Nessun altro ecosistema mainstream tratta la compatibilità con la stessa serietà, e chi ha vissuto la migrazione da Python 2 a Python 3 sa quanto vale.

L'ecosistema è enorme e maturo. Spring — e in particolare Spring Boot — copre praticamente tutto quello che serve a un backend aziendale: gestione delle dipendenze, accesso ai database, sicurezza, transazioni, messaggistica. È un framework opinionato, e in questo contesto è un pregio: dieci sviluppatori diversi producono codice strutturato allo stesso modo.

Le competenze si trovano. Un'azienda che sceglie una tecnologia si chiede anche chi la manterrà tra cinque anni. Java è insegnato in tutte le università e ci sono migliaia di persone che lo conoscono.

I limiti, detti onestamente

È verboso davvero. Le difese di sopra valgono per i sistemi grandi. Per uno script che legge un file CSV e manda una mail, Java è lo strumento sbagliato.

L'avvio è lento. La JVM deve partire, caricare le classi, scaldarsi. Un'applicazione Spring Boot può metterci qualche secondo. Su un server sempre acceso non importa; su una funzione serverless che parte e muore a ogni richiesta è un problema serio — e infatti esistono GraalVM e le immagini native proprio per aggirarlo.

Consuma memoria. Una JVM con un'applicazione di media complessità occupa facilmente centinaia di megabyte. Su un container piccolo si sente, ed è una voce di costo reale quando moltiplichi per cento istanze in produzione.

La configurazione iniziale è pesante. Tra Maven o Gradle, struttura delle cartelle e annotazioni, arrivare al primo "ciao mondo" utile richiede molto più tempo che in Python o JavaScript. Come primo linguaggio in assoluto non è la scelta più gentile: il ragionamento completo è in quale linguaggio imparare nel 2026.

Errori comuni che fanno perdere ore

Confrontare gli oggetti con ==. È l'errore classico e silenzioso: == confronta i riferimenti, non il contenuto.

String a = new String("ciao");
String b = new String("ciao");

a == b        // false: due oggetti diversi in memoria
a.equals(b)   // true: stesso contenuto

Funziona per caso con le stringhe letterali (perché la JVM le riusa) e poi smette di funzionare quando la stringa arriva da un file o da una richiesta HTTP. È la fonte di bug più comune in assoluto tra chi inizia.

NullPointerException ovunque. In Java qualunque riferimento può essere null e il compilatore storicamente non aiutava. Usa Optional per i valori che possono mancare e non restituire mai null da un metodo pubblico se puoi evitarlo.

Usare float o double per i soldi. 0.1 + 0.2 non fa 0.3 in virgola mobile, e su un sistema contabile questo diventa una segnalazione di bug. Per gli importi si usa BigDecimal, sempre.

Ignorare le eccezioni. Un catch vuoto fa sparire il problema dai log e lo fa ricomparire dieci livelli più in là, in forma irriconoscibile.

Non scrivere test. Nel mondo Java JUnit è dato per scontato e un progetto senza test viene considerato incompleto in sede di revisione — vedi cosa sono i test del software.

Il mercato italiano

È il punto concreto che interessa a chi sta scegliendo cosa studiare. In Italia Java è, insieme a JavaScript, il linguaggio con più offerte di lavoro aperte, e con una distribuzione particolare: molte posizioni sono in aziende consolidate, banche, assicurazioni, società di consulenza e fornitori della pubblica amministrazione. Meno startup, più contratti stabili, più Milano, Roma e Torino.

Le retribuzioni sono in linea con quelle degli altri profili backend: i numeri sono in quanto guadagna un backend developer in Italia. La fotografia per linguaggio è in i migliori linguaggi in Italia.

In sintesi

Java compila in bytecode ed esegue sulla JVM. Da qui arrivano la portabilità reale, le buone prestazioni a regime, l'avvio lento e il consumo di memoria: sono facce della stessa scelta.

La verbosità è un compromesso, non un difetto assoluto. Costa su progetti piccoli, paga su sistemi grandi mantenuti a lungo da team che cambiano.

Le aziende lo scelgono per stabilità, compatibilità all'indietro ed ecosistema, non per moda. Ed è proprio per questo che continua ad avere tante posizioni aperte.

Non è adatto a tutto. Script brevi, funzioni serverless e prototipi rapidi hanno strumenti migliori.

Se conosci Java, C# lo leggi già dal primo giorno. Per collocarlo rispetto a tutti gli altri, la mappa completa è in tutti i linguaggi di programmazione; se invece parti da zero, il percorso è in come imparare a programmare da zero.