Post

Java Comparable

DOMANDA: Che differenza c'è in Java tra il Comparator e Comparable? RIPOSTA: La differenza è sottile. Il Comparator ( java.util.Comparator ) ci permette di confrontare due oggetti differenti, Comparable ( java.lang.Comparable ) invece confronta se stesso con un altro oggetto. Entrambe le interfacce consentono di confrontare due oggetti non misurabili. Ad esempio è facile dire che 1 è minore di 10, ma che significa confrontare due Impiegati? Potremmo intendere un paragone in termini di età anagrafica, oppure di ruolo gerarchico o ancora di stipendio. Per definire qual è il termine di paragone dobbiamo implementare un Comparator o un Comparable . Ieri abbiamo visto cos'è e come si usa un Comparator , per cui oggi affrontiamo lo stesso problema con la classe Comparable . La classe Impiegato (che implementa Comparable ): package comparable; public class Impiegato implements Comparable<Impiegato> {    private String nome;    private i

Java Comparator

DOMANDA: Cos'è e come funziona il Comparator in Java? RISPOSTA: Il Comparator è un'interfaccia Java ( java.util.Comparator ) che permette di confrontare due oggetti non misurabili in modo naturale.  Bisogna precisare che Comparator è capace di confrontare due oggetti differenti mentre Comparable   confronta l' istanza stessa con un altro oggetto. Facciamo un esempio creando un comparatore di voti scolastici. Creiamo inizialmente una Enum   che rappresenta tutti i voti possibili: package comparator; public enum VotiScuola {     INSUFFICIENTE (4),     MEDIOCRE (5),     SUFFICIENTE (6),     BUONO (7),     OTTIMO (8),     ECCELLENTE (9);     private final int votoNum;     private VotiScuola( int votoNum){       this .votoNum = votoNum;    }     public int getVoto() {       return votoNum;    } } Creiamo un Comparator che confronta i differenti voti: package comparator; public class VotiScuolaComparator implements

Autoboxing e Unboxing Java

DOMANDA: Cosa sono l'Autoboxing e l'Unboxing in Java? RISPOSTA: Dalla versione 1.5 di Java in poi è stata introdotta una funzionalità davvero comoda che viene chiamata Autoboxing (e l'opposta  Unboxing ). Trascurando i termini tecnici l' Autoboxing non è altro che un casting automatico con cui Java trasforma i tipi di dato primitivi nei corrispettivi ad oggetto e viceversa ( Unboxing ). Vediamo un rapido esempio: package autoboxing; public class TestAutoboxing {    public static void main(String[] args) {       Integer interoObj = 123; // autoboxing       int primitivoInt =  new Integer(123); // unboxing       System.out.println( "Hai inserito " + interoObj);       System.out.println( "Hai inserito " + primitivoInt);       Integer somma = interoObj + primitivoInt + 10 ; // autoboxing e unboxing       System.out.println( "La somma è: " + somma);       // test locazione di memoria       if (intero

Tipi primitivi: range di rappresentazione

DOMANDA: Quali sono i range di valori rappresentabili dai tipi di dati primitivi Java? RISPOSTA: Benché non siano facilissimi da ricordare, è importante sapere i limiti di rappresentazione dei diversi tipi per prevenire o evitare di trovarsi a fronteggiare errori di calcolo difficilmente individuabili. Ecco una tabella riepilogativa dei diversi range : BYTE (8 bit) :             da     -128     a     127   SHORT (16 bit) :           da     -32.768     a     32.767 INT (32 bit) :             da     -2.147.483.648     a     2.147.483.647 LONG (64 bit) :            da     -9.223.372.036.854.774.808     a     9.223.372.036.854.774.807 FLOAT (32 bit) :           da    1,4e -045      a     3,4e +038 DOUBLE (64 bit) :          da    4,9e -324      a     1,8e +308 CHAR (16 bit) - Unicode:  da     0    a     65.536 BOOLEAN (1  bit) :             true     o     false Ed ecco cosa succede a sbagliare il tipo di dato in un calcolo: public class RangeTest {   publ

Bug: ThreadLocalRandom

DOMANDA: Perché se provo a generare numeri casuali in Java 7 con la classe ThreadLocalRandom ottengo sempre gli stessi numeri ad ogni esecuzione? package numerirandomici; import java.util.concurrent.ThreadLocalRandom; public class RandomTest2 {     public static void main(String[] args) {       int random1 = ThreadLocalRandom.current().nextInt(1, 5); // da 1 (compreso) a 5 (escluso)       double random2 = ThreadLocalRandom.current().nextDouble(1, 5);  // da 1,00 (compreso) a 5,00 (escluso)       System.out.println(random1);       System.out.println(random2);    } } RISPOSTA: La classe ThreadLocalRandom , disponibile da Java 7 in poi, permette di generare i numeri casuali in maniera più efficiente rispetto al classico Math.random(). Il codice postato è corretto ma probabilmente hai installato la prima versione di Java 7. Purtroppo nella prima versione di Java 7 c'era un bug , risolto con l' update 2 sia del JRE che del JDK . Quindi basta scari

Numeri randomici in Java

DOMANDA: Come si generano i numeri casuali (random) in Java? RISPOSTA: Come in tutti i linguaggi di programmazione, in Java i numeri non sono realmente casuali , ma pseudo-randomici . La non reale randomicità è dovuta al fatto che è comunque tutto basato su un algoritmo matematico. Vediamo come generare dei numeri casuali da 1 a 1000: package numerirandomici; public class RandomTest1 { public static void main(String[] args) {       int random = ( int ) (Math.random()*1000+1);       System.out.println(random);    } } La spiegazione è semplice: Math.random() genera dei numeri casuali da 0 (compreso) a 1 (escluso). Il numero 1 costituisce il limite minimo dell'intervallo e 1000 quello massimo . Facciamo qualche esempio reale: - Math.random() genera 0,200. Moltiplicando 0,2 * 1000 otteniamo 200, sommando 1 abbiamo 201; -  Math.random() genera 0,220. Moltiplicando 0,14 * 1000 otteniamo 140, sommando 1 abbiamo 141; - Math.random() genera 0,000. Moltiplicando 0 *

Java: eventi personalizzati

DOMANDA: Come posso creare un evento personalizzato in Java? RISPOSTA: Oltre gli eventi normalmente forniti da Java è possibile creare dei propri eventi personalizzati .  Vediamo come attraverso questo esempio che scatena un evento ogni volta che cambiamo il timeout dell'oggetto Timer. Innanzitutto creiamo un evento TimerEvent (per essere un evento deve estendere la classe java.util.EventObject ): package eventipersonalizzati; import java.util.*; public class TimerEvent extends EventObject{     private static final long serialVersionUID = 1L;     public TimerEvent(Object sorgente){        super(sorgente);    } } Creiamo l'interfaccia del nostro listener ( ascoltatore in attesa di catturare gli eventi generati) chiamata TimerListener : package eventipersonalizzati; import java.util.EventListener; public interface TimerListener extends EventListener{    public void onTimerChange(TimerEvent timEv); } E la implementiamo in