Enum constant class body - questao do Caelum

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?

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:

[code]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());
}
}[/code]

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.

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());
	 }
   }
 }  
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;   
	       }
	     
	     
	   }; 

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