Java Enumerations
DOMANDA:
Esistono in Java le Enumerazioni?
RISPOSTA:
Si, anche in Java esistono gli enum Types (Enumerations). Un enum type contiene un insieme di costanti.
Vediamo subito un esempio di come creare un enum:
public enum Coordinate {
NORD,
SUD,
OVEST,
EST
}
NORD,
SUD,
OVEST,
EST
}
(n.b.: sono scritte in maiuscolo dato che sono delle costanti)
Come si nota, per definire un'enumerazione basta la parola chiave enum.
Un esempio di utilizzo dell'enum precedente in CoordinateTest:
public class CoordinateTest {
public static void main(String args[]){
Coordinate c = Coordinate.NORD; // input hardcoded
switch(c){
case NORD:
System.out.println("Stai andando a NORD");
break;
case SUD:
System.out.println("Stai andando a SUD");
break;
case EST:
System.out.println("Stai andando a EST");
break;
case OVEST:
System.out.println("Stai andando a OVEST");
break;
default:
System.out.println("Stai vagando senza meta");
break; //questo è facoltativo
}
}
}
public static void main(String args[]){
Coordinate c = Coordinate.NORD; // input hardcoded
switch(c){
case NORD:
System.out.println("Stai andando a NORD");
break;
case SUD:
System.out.println("Stai andando a SUD");
break;
case EST:
System.out.println("Stai andando a EST");
break;
case OVEST:
System.out.println("Stai andando a OVEST");
break;
default:
System.out.println("Stai vagando senza meta");
break; //questo è facoltativo
}
}
}
Ovviamente l'output sarà: "Stai andando a NORD".
Gli enum types Java in realtà sono molto più potenti delle enumerazioni degli altri linguaggi. Infatti gli enum Java sono delle classi a tutti gli effetti e, quindi, possono includere anche metodi ed altri campi.
Il compilatore aggiunge in automatico anche dei metodi speciali quando inseriamo i campi enum (ad esempio ci sarà un metodo statico che restituisce un array contenente tutti i valori dichiarati nell'esatto ordine in cui li abbiamo scritti).
Possiamo anche inserire uno o più costruttori, a patto che siano privati o package-private (quindi senza inserire il modificatore di visibilità) perché le enum non possono essere instanziate esplicitamente con la parola chiave new; la classe creerà infatti in automatico le costanti definite all'interno del corpo della classe.
Guardiamo insieme un esempio di enum più complesso:
package enumeration;
import javax.swing.JOptionPane;
public enum Pianeta {
MERCURIO (3.303e+23, 2.4397e6),
VENERE (4.869e+24, 6.0518e6),
TERRA (5.976e+24, 6.37814e6),
MARTE (6.421e+23, 3.3972e6),
GIOVE (1.9e+27, 7.1492e7),
SATURNO (5.688e+26, 6.0268e7),
URANO (8.686e+25, 2.5559e7),
NETTUNO (1.024e+26, 2.4746e7);
private final double massa; // in chilogrammi
private final double raggio; // in metri
// costruttore package-private
Pianeta(double massa, double raggio) {
this.massa = massa;
this.raggio = raggio;
}
// costante gravitazionale universale (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
double gravitaSuperficiale() {
return G * massa / (raggio * raggio);
}
double pesoSuperficiale(double otherMass) {
return otherMass * gravitaSuperficiale();
}
public static void main(String[] args) {
String valore = JOptionPane.showInputDialog("Inserisci il tuo peso");
double pesoTerrestre = Double.parseDouble(valore);
double massa = pesoTerrestre/TERRA.gravitaSuperficiale();
for (Pianeta p : Pianeta.values())
System.out.printf("Il tuo peso su %s è %f kg%n",
p, p.pesoSuperficiale(massa));
}
}
import javax.swing.JOptionPane;
public enum Pianeta {
MERCURIO (3.303e+23, 2.4397e6),
VENERE (4.869e+24, 6.0518e6),
TERRA (5.976e+24, 6.37814e6),
MARTE (6.421e+23, 3.3972e6),
GIOVE (1.9e+27, 7.1492e7),
SATURNO (5.688e+26, 6.0268e7),
URANO (8.686e+25, 2.5559e7),
NETTUNO (1.024e+26, 2.4746e7);
private final double massa; // in chilogrammi
private final double raggio; // in metri
// costruttore package-private
Pianeta(double massa, double raggio) {
this.massa = massa;
this.raggio = raggio;
}
// costante gravitazionale universale (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
double gravitaSuperficiale() {
return G * massa / (raggio * raggio);
}
double pesoSuperficiale(double otherMass) {
return otherMass * gravitaSuperficiale();
}
public static void main(String[] args) {
String valore = JOptionPane.showInputDialog("Inserisci il tuo peso");
double pesoTerrestre = Double.parseDouble(valore);
double massa = pesoTerrestre/TERRA.gravitaSuperficiale();
for (Pianeta p : Pianeta.values())
System.out.printf("Il tuo peso su %s è %f kg%n",
p, p.pesoSuperficiale(massa));
}
}
Lanciando la classe Planet ed inserendo 78 come peso, otterremo il seguente output:
Il tuo peso su MERCURIO è 29,465094 kg
Il tuo peso su VENERE è 70,589930 kg
Il tuo peso su TERRA è 78,000000 kg
Il tuo peso su MARTE è 29,541500 kg
Il tuo peso su GIOVE è 197,383487 kg
Il tuo peso su SATURNO è 83,149212 kg
Il tuo peso su URANO è 70,599922 kg
Il tuo peso su NETTUNO è 88,789590 kg
Il tuo peso su VENERE è 70,589930 kg
Il tuo peso su TERRA è 78,000000 kg
Il tuo peso su MARTE è 29,541500 kg
Il tuo peso su GIOVE è 197,383487 kg
Il tuo peso su SATURNO è 83,149212 kg
Il tuo peso su URANO è 70,599922 kg
Il tuo peso su NETTUNO è 88,789590 kg
Commenti
Posta un commento