Java è ancora oggi uno dei linguaggi più utilizzati a livello di business.
È multipiattaforma, è ad alto livello, completo di framework e librerie che aiutano gli sviluppatori a non preoccuparsi dei dettagli e ha ancora oggi pieno supporto delle aziende più grandi (come Netflix, Red Hat, Apache etc..).
Ogni tanto sento questo falso mito per cui Visual Studio Code sarebbe adatto solo a programmare Front-end. Eh bene no: è possibile configurare un intero progetto Java ed avere tutte le caratteristiche che un normale IDE potrebbe offrirti. Ecco come.
Prerequisiti
Questo articolo tratterà di come creare, gestire ed avviare progetti e workspace Java con Visual Studio Code. È dunque un prerequisito fondamentale, che non sarà trattato, avere la JDK ed aver impostato correttamente le variabili d'ambiente relative a JAVA (PATH
, JAVA_HOME
, CLASSPATH
). La versione di Java non è invece di alcun interesse, la guida è basata su versioni uguali e superiori a Java 8.
Aprire la cartella giusta
Ogni lungo viaggio inizia con il primo passo. È necessario quindi già identificare quale sia la cartella giusta da aprire.
Qual è la combinazione più corretta? Un workspace contenente più progetti oppure un'istanza di Visual Studio Code per ogni progetto?
Non esiste in realtà una giusta decisione in merito, il mio consiglio è quello di aprire un'istanza di Visual Studio Code per ogni progetto, a meno che più progetti non siano in forte correlazione tra di loro.
Come aprire una cartella
Come già spiegato in lezioni precedenti è possibile aprire una cartella dalla barra dei menù tramite "File → Open Folder".
In alternativa, da terminale ci si può posizionare nella cartella del progetto con il comando cd
e utilizzare il comando code .
. O ancora specificare direttamente il percorso assoluto o relativo della cartella code percorso/cartella
.
Visual Studio Code aprirà un'istanza separata dal terminale, è quindi possibile richiudere il terminale senza rischiare di chiudere anche l'editor.
Installare le estensioni più adatte
Normalmente Visual Studio Code, quando individua la struttura di un progetto Java già completo o se si apre un file con estensione .java
, invia una notifica in basso a destra, chiedendo all'utente se è disposto ad installare le estensioni raccomandate:
Ma se si sta creando un nuovo progetto non si hanno file con cui l'editor possa riconoscere le nostre intenzioni. Quindi ecco la lista di estensioni consigliate:
- VisualStudioExptTeam.vscodeintellicode
- vscjava.vscode-java-pack
- vscjava.vscode-maven
- vscjava.vscode-java-debug
- vscjava.vscode-java-dependency
- vscjava.vscode-java-test
- redhat.java
Cercando "java" nella barra di ricerca delle estensioni dovrebbero pero comparire da subito tra i primi risultati:
Creiamo un progetto Java
Per creare un progetto Java si apra la palette dei comandi (CTRL+Shift+P) e si scriva "Create Java Project". Va cliccata quindi la voce apposita:
Apparirà un altro pop-up che chiederà che tipo di progetto Java si vuole installare: progetto semplice (No Build Tool), Maven, Spring, Gradle etc...
Anche qui, non esiste una scelta corretta, è la necessità nonché il caso a farla da padrone. Si supponga comunque di voler creare un progetto semplice cliccando la prima voce.
Si aprirà il file manager di sistema dove indicare la posizione del progetto. Si scelga la cartella corrente e si dia un nome al progetto. Verrà quindi aperta una nuova istanza di Visual Studio Code nella cartella del nuovo progetto. Inoltre verrà creata la cartella src
, un file App.java
da cui iniziare, una cartella lib
e una cartella .vscode
al cui interno si può trovare un file di configurazione settings.json
:
{
"java.project.sourcePaths": ["src"],
"java.project.outputPath": "bin",
"java.project.referencedLibraries": [
"lib/**/*.jar"
]
}
A quel punto potete anche chiudere una delle due istanze aperte. Supponiamo di tenere aperta quella che lancia Visual Studio Code a seguito della creazione.
Per attivare tutti gli strumenti delle estensioni, apriamo il file App.java
. A questo punto, sul pannello in modalità "esplorazione file" dovrebbe aprirsi una tab chiamata "Java Projects".
Se non si vede la tab qualcosa è andato storto nel processo di configurazione ed è necessario riprovare.
Avviare una classe
Se il file App.java
è ancora aperto, si può notare poco sopra il main le due scritte "Run" e "Debug". Cliccando una dei due si può procedere con l'avvio di una classe o il suo debug.
Si può anche notare come il file di configurazione abbia fatto si che il prodotto della fase di compilazione finisse nella cartella bin
.
Per l'esattezza la riga del file che lo ha permesso è la seguente:
"java.project.outputPath": "bin",
È importante notare come sia l'avvio che il debug della classe non necessitano in alcun modo di configurazioni manuali del file launch.json
, è tutto automatizzato.
Creare una nuova classe: metodo classico
A questo punto è possibile creare classi e package, il metodo più classico è sicuramente quello di creare a mano un file .java
.
Per farlo bisogna posizionarsi sul pannello degli editor e cliccare sulla cartella src
, quindi sull'icona per aggiungere un nuovo file.
Dopo aver inserito il nome con la giusta estensione, verranno automaticamente compilati i campi della classe, apparirà anche un menù a tendina che consentirà di scegliere tra le varie tipologie di classi Java (interfaccia, classe, enumerazione, etc...)
Ovviamente per creare un nuovo package, ed una sua classe, bisogna creare prima la cartella e quindi il file al suo interno.
Creare una nuova classe: sezione "Java Projects"
Alternativamente è possibile interagire con sezione "Java Projects" ed aggiungere da li una nuova classe con un semplice click.
Si aprirà un pop-up sulla parte superiore dello schermo dove si potrà inserire il nome della classe (attenzione, il nome della classe, non il nome del file, ovvero non bisogna scrivere l'estensione).
Ora arriva la parte interessante: da qui infatti è possibile creare in un sol colpo cartelle e file. Basta usare la notazione dei package Java separando le cartelle con il carattere ".".
Attenzione però: dopo aver creato il primo package, il layout del pannello di esplorazione cambia. Per creare una nuova classe non ci sarà più la cartella src
ma vedrete invece il nome del progetto.
Code generation
Una volta creato il file che rappresenta la classe vi è sicuramente la necessità di inserire altre istruzioni e metodi utili.
Alcuni di questi son coperti dalla code generation di Visual Studio Code, ovvero tramite poche azioni si possono generare interi blocchi di codice.
Generare il main
È possibile generare il metodo main
scrivendo "main", nel corpo di una classe, seguito da CTRL+Spazio e quindi Invio (il suggerimento potrebbe apparire anche prima di premere CTRL+Spazio).
Generare Getter e Setter
Nelle classi spesso vi son variabili d'istanza, di cui dover generare i metodi per prelevarne il valore (i così detti getter) ed i metodi per impostarne il valore (o meglio i setter).
Si può delegare il compito a Visual Studio Code posizionandosi nel corpo della classe (al di fuori di ogni altro metodo) e scrivendo "set" (per i setter) o "get" (per i getter) e selezionando dal menu a tendina il valore giusto.
Se il menu a tendina non dovesse comparire, si può utilizzare la shortctu CTRL+Spazio per forzarla.
È possibile continuare scrivendo il nome della variabile per avere una corrispondenza più precisa dell'autogenerazione.
L'unico problema rispetto questo genere di approccio, è che la procedura deve essere ripetuta per ogni variabile e per ognuno dei due metodi.
Metodi di Object
Similmente è possibile autogenerare i classici ereditati da Object
, iniziando a scrivere il titolo ed aspettando che il pop-up riconosca il metodo. Si parla ad esempio di:
toString
equals
hashCode
clone
finalize
È possibile autogenerare anche il costruttore vuoto pubblico, scrivendo "ctor<" e selezionando la voce sul menu
Implementazioni e Override
Sempre con lo stesso meccanismo è possibile autogenerare facilmente override di metodi delle super classi oppure implementazioni obbligatorie di interfacce.
Ad esempio implementando Comparable
, posizionandosi con il cursore su una zona vuota e premendo CTRL+Space è possibile autogenerare il compareTo
Blocchi di codice e istruzioni
È possibile generare velocemente blocchi di codice o istruzioni come:
System.out.println
digitando "sysout" e premendo Invio. Esistono varie versioni, come "syserr" per stampare sullo standard error o "soutm" e "systrace" per stampare il nome della classe e del metodo corrente.try catch
scrivendo "try_catch". Si può anche generare la variante con la resource, scrivendo "try_resource".for
sia nella variante con indice, scrivendo "fori", sia nella variante con l'iteratore automatico scrivendo "foreach". Viene selezionato come vettore/lista l'ultimo rilevato nel codice.while
edowhile
. Scrivendoli semplicemente e selezionando la voce apposita dal menu.switch
scrivendolo e selezionando la voce. Viene anche preselezionata col cursore la chiave di scelta dello switch.
Ovviamente esistono tantissime altri chiavi di auto generazione, non è possibile elencarle tutte, premendo CTRL+Space con il cursore testo posizionato su uno spazio vuoto se ne può consultare l'elenco.
Auto import
È ovviamente presente la funzione di import automatizzati. Già mentre si scrive del codice, se viene riconosciuta una classe basta cliccarla sul menu a tendina per importarla in automatico
Ma se si vuole eseguire quest'operazione a posteriori è comunque possibile utilizzare la shortcut apposita, con id editor.action.organizeImports
:
- su Windows e Linux Alt+Shift+O;
- Su MacOS Shift+Option+O.
Se sono disponibili più scelte si attiverà inoltre un pop-up che permetterà di selezionare quello che si desidera.
È comunque da notare che la funzionalità di auto import di Visual Studio Code non sempre riconosce correttamente le classi da importare.
Comment block e comment lines
Si può commentare un intero blocco di codice facilmente con CTRL+Shift+a o linea per linea con CTRL+Shift+7.
Code Generation con altre estensioni
Li dove non arrivano le estensioni consigliate da Visual Studio Code arrivano altre estensioni. In questa parte viene consigliata sohibe.java-generate-setters-getters.
Tutte le funzionalità di questa estensione di ottengono aprendo la palette dei comandi, sempre con CTRL+Shift+P.
Generare getter e setter con un'estensione
È possibile con quest'estensione generare d'un colpo tutti i getter e setter delle variabili.
Aprendo la palette dei comandi, scrivendo "Generate Getters" e selezionando l'opzione "Generate Getters and Setters" vedrete tutti i getters ed i setters generati
Generare toString con un'estensione
Similmente si possono generare tutti i metodi di Object
con la stessa estensione, ma una menzione particolare la merita sicuramente il metodo toString
, infatti il contenuto della stringa generata tiene conto di una struttura simile a quella di un JSON, con il carattere '=' per l'assegnazione e il carattere ',' per separare i campi
Generare tutti i costruttori con un'estensione
È infine possibile generare tutti i tipi di costruttore con la medesima estensione, sia quello vuoto che quello con tutti i campi, finanche quelli con le notazioni di Lombok.