Enum constant class body - questao do Caelum

5 respostas
C

Tenho duvida:

01 class A {
02   enum Pferde {
03     PONY(10), ESEL(15) {
04       public int get() {
05         return 15;
06       }
07     }, 
08     MULI(20);
09   
10     Pferde(int i) { }
11   };
12   
13   public static void main(String[] args) {
14     System.out.println(Pferde.ESEL.get());
15   }
16 }

Porque na linha 14, Pferde.ESEL.get() nao pode chamar?

5 Respostas

J
Porque o método não foi definido para todas as constantes, só para ESEL. Para que funcione é preciso que exista o método para todas as constantes, definido dessa forma:
class A {   
   enum Pferde {   
     PONY(10), ESEL(15) {   
       public int get() {   
         return 15;   
       }   
     },   
     MULI(20);   
     
     Pferde(int i) { }
     public int get() {   
         return 10;   
       }   
   };   
     
   public static void main(String[] args) {   
     System.out.println(Pferde.ESEL.get());   
   }   
 }
M

Você não está utilizando um “constant specific class body” corretamente. Utiliza-se o mesmo quando precisamos sobreescrever um método do Enum, no exemplo mostrado não há um método existente. Dê uma olhada nesse código agora:

public class TesteEnum {
	enum Pferde {
		PONY(10), ESEL(15) {
			public int get() {
				return 1005;
			}
		},
		MULI(2);
		
		private int i;
		
		Pferde(int i) {
		}
		
		public int get() {
			return i;
		}
	};
	
	Pferde pf;
	
	public static void main(String[] args) {
		TesteEnum te = new TesteEnum();
		te.pf = Pferde.ESEL;
		
		System.out.println(te.pf.get());
	}
}

Abraços.

T

Acho que tem a ver com isto aqui.

Pelo visto, você só pode definir um método para uma constante de uma enum, e conseguir acessá-lo, se ele for um “override” de um método que é dessa enum. (Para quem achou esquisitos os nomes - Pferde é o plural de Pferd (um equino qualquer, ou então um cavalo), Pony é um pônei, Esel um jumento, e Muli uma mula.

A JLS diz (em seu estilo semelhante ao estilo jurídico):

De qualquer maneira, veja a JLS ( http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.9 ) e leia o último exemplo.

class A {
   enum Pferde {
     PONY(10), ESEL(15) {
       public int get() {
         return 17;
       }
     }, 
     MULI(20);
   
     Pferde(int i) { this.i = i; }
	 
     private final int i;
	 public int get() {
	     return i;
	 }
   };
   
   public static void main(String[] args) {
     for (Pferde pferd : Pferde.values()) {
	     System.out.println (pferd.get());
	 }
   }
 }
E
enum Pferde { PONY(10), ESEL(15) { public int getInt() { return 15; } }, MULI(20);
private int number;
	     
	     Pferde(int i){
	    	 this.number=i;
	     }
	     
	     public int getInt() {   
	         return this.number;   
	       }
	     
	     
	   };
C

thingol, é isso mesmo. Tem um metodo subscrito só no ESEL (15), mas na verdade, ele vai imprimir 17.

Criado 20 de fevereiro de 2008
Ultima resposta 20 de fev. de 2008
Respostas 5
Participantes 5