Post

Differenza tra equals() ed ==

Immagine
DOMANDA: Che differenza c'è tra il metodo equals() e ==? RISPOSTA: Utilizzare il metodo equals(Object o) ereditato da Object() o utilizzare l' operatore di confronto == è estremamente differente.  METODO equals() Utilizzando questo metodo stiamo confrontando due oggetti secondo dei criteri di uguaglianza di contenuto , cioè potremmo confrontare una persona con un'altra persona, un animale con un altro animale e così via. Il metodo equals() permette infatti, con opportune personalizzazioni, di selezionare quali sono i criteri di confronto. Così potremo decidere se una persona è uguale ad un'altra se hanno nome e cognome uguali, oppure nome, cognome e data di nascita, ecc... ecc... OPERATORE == Questo operatore di confronto valuta l'uguaglianza sostanziale, ovvero se l'oggetto, il riferimento o il tipo di dato primitivo a sinistra è effettivamente lo stesso di quello a destra. Quindi risulterà vero soltanto quando i riferimenti di memori

Rappresentare numeri grandissimi

DOMANDA: E' possibile rappresentare in Java dei numeri grandissimi che hanno un valore oltre quello consentito dai tipi di dati primitivi long e int? RISPOSTA: Come abbiamo visto nel post sul range di valori rappresentabili con i diversi tipi di dati primitivi, effettuare un'operazione il cui risultato vada oltre tale limite comporta un errore di calcolo con conseguenze potenzialmente disastrose. La soluzione a tali limitazioni esiste: la prima, più complessa, rientra nell'analisi numerica e in algoritmi di troncamento, arrotondamento e bit shifting, ma non è scopo di questo post. La seconda invece è messa a disposizione da Java con le classi java.math.BigInteger e java.math.BigDecimal (rispettivamente per i numeri interi e decimali). Guardiamo con un esempio come funzionano: package bignumbers; import java.math.BigInteger; public class BigNumbers { public static void main(String[] args) { // rappresentazione errata oltre i limiti

Stampare un file su carta

DOMANDA: Come si manda in stampa un file in Java? RISPOSTA: Ci sono diversi modi per stampare un file su carta direttamente da Java . Vediamo quello più veloce ed immediato grazie alla classe java.awt.Desktop introdotta a partire da Java 6: package stampa; import java.awt.Desktop; import java.io.File; import java.io.IOException; import javax.print.PrintException; public class StampaFile {   public static void main(String[] args) throws PrintException, IOException {     if(!java.awt.Desktop.isDesktopSupported()) {       System.out.println("Funzione non supportata!");       return;     }     try {       Desktop desk = java.awt.Desktop.getDesktop();       // mando in stampa il file       desk.print(new File("C:\\prova.pdf"));     } catch (NullPointerException | IllegalArgumentException | UnsupportedOperationException |         IOException | SecurityException ex) {       ex.printStackTrace();     }   } } Eseguendo questa classe invierete diret

Annotations: @Override

DOMANDA: Perché si utilizza l'annotazione @Override? A cosa serve e quali sono i vantaggi? RISPOSTA: @Override è una annotazione aggiunta a partire da Java 5 ed utilizzata per indicare al compilatore che il metodo su cui è posta sta effettuando un override (sovrascrittura) di un metodo della sua superclasse o, da Java 6 , anche di un'interfaccia. La domanda nasce spontanea: "cosa cambia se non lo utilizzo?" . Proviamo a fare un override sul metodo equals() della superclasse Object : public class Animale{ private String nome; public boolean equals(Animale animale){ return nome.equals(animale.nome); } } Come si nota non abbiamo utilizzato @Override ... e infatti non stiamo effettuando un override , bensì un overloading ! Sicuramente la maggior parte di voi non avrà fatto caso all'errore. Il metodo equals() ereditato della classe Object accetta come parametro un Object (non un Animale ), di conseguenza il compilatore riconoscerà il m

Java Reflection: accesso a metodi e campi privati

DOMANDA: Come si può accedere da un classe generica ai metodi e alle variabili di istanza private di un'altra classe? RISPOSTA: Genericamente non è possibile accedere ai campi o metodi privati  di un'altra classe. Ma g enericamente non vuol dire in modo assoluto! Infatti, grazie alla Reflection Java possiamo accedere ai campi privati di un'altra classe. Analizziamo alcuni metodi che ci mette a disposizione la classe java.lang.Class : getFields() : permette di recuperare la lista di tutti i campi pubblici della classe e della sua superclasse; getDeclaredFields() : fornisce la lista di tutti i campi presenti nella classe (senza distinzione di visibilità); getDeclaredMethods() : come sopra ma applicato ai metodi; getDeclaredField(String nome) : restituisce il Field indicato come parametro (senza distinzione di visibilità); getDeclaredMethos(String nome) : restituisce il Method indicato come parametro (senza distinzione di visibilità). Guardiamo l&

Java 7: Multicatch

DOMANDA: In un try/catch c'è modo di scrivere più eccezioni nello stesso catch evitando così codice ridondante nel caso di stesso comportamento? RISPOSTA: Fino a Java 6 succede una cosa alquanto scomoda nell'utilizzo del try/catch : quando ci troviamo di fronte ad un codice che ha lo stesso comportamento con diverse eccezioni , siamo costretti a dover ripetere lo stesso codice più volte dentro diversi catch . Guardiamo nel dettaglio un esempio in cui posso avere due eccezioni a runtime : una NumberFormatException qualora inserisca in input un formato non compatibile con la conversione in int (ad esempio delle lettere), oppure una ArithmeticException qualora inserisca un numero non compreso nell'intervallo 0 e 5 (estremi esclusi): package multicatch; import java.util.Scanner; public class OldCatch { public static void main(String args[]) { try { Scanner scanner = new Scanner(System.in); String number = scanner.next(); scanner.clos

Creare una finestra di scelta file con JFileChooser

Immagine
DOMANDA: Come si fa a visualizzare una finestra per la scelta di un file in Java? RISPOSTA: Java mette a disposizione la classe javax.swing.JFileChooser che permette di aprire con poche righe di codice una finestra di selezione (Dialog) per i file . Guardiamo l'esempio con la classe FileDialog : package file; import java.io.File; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; public class FileDialog { public static void main(String[] args) { // impostazione della directory di partenza JFileChooser fileScelto = new JFileChooser("C:\\"); // creazione di due filtri FileFilter filtroJpg = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg"); FileFilter filtroTxt = new FileNameExtensionFilter("TXT file", "txt"); // inserisco nella scelta del tipo di file un filtro TXT fileScelto.