Sobreescrita de método em Enum

Galera como vocês bem sabem é possível em um enum sobreescrever um método para uma das contantes do enum, porém se eu usar o mesmo recurso para criar um novo método não presente fora da constante em questão eu não consigo acessá-lo, mesmo sendo público! Vejam abaixo e fica mais fácil de entender:


enum MyEnum{
    A(1),
    B(2){
        Integer getI(){return i*i}
        public String fazNada(){return "fazendo nada"}
    },
    C(3),

    Integer i;

    MyEnum(Integer i){
        this.i=i;
    }

    Integer getI(){
        return i;
    }
}

class UsaEnum{
    public static void main(String[] args){
        MyEnum m = MyEnum.A
        System.out.println(m.getI()); //escreve 1

        MyEnum m2 = MyEnum.B
        System.out.println(m2.getI()); //escreve 4 (i*i)
        System.out.println(m2.fazNada()); //erro

    }
}

Então, o código do enum compila mas não consigo acessar o método na classe de teste. Tem alguma forma de fazer?

fausto, qual é o erro que está ocorrendo?

Talvez esteja falando besteira, mas a impressão que dá é que o metódo dentro da constante tem que ser sobrescrito necessariamente, e não escrito direto nela, mesmo sendo public.

Então ocorre que o Enum está ok, o compilador não reclama. Mas quando crio uma classe para usá-lo dá a seguinte mensagem:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The method fazNada() is undefined for the type MyEnum

Mesmo usando reflection não consegui acessar ele…

Desculpe cara, por reflection consegui sim (estava fazendo errado), pelo menos o nome do método eu consegui acessar, ou seja ele está lá 8)

Fausto,

[code]enum MyEnum{
A(1),
B(2){
Integer getI(){return i*i;}
public String fazNada(){return “método da constante”;}
},
C(3);

 Integer i;  

 MyEnum(Integer i){  
     this.i=i;  
 }  

 Integer getI(){  
     return i;       
 }  

 public String fazNada(){
return "método do enum";
 }	

}

public class UsaEnum{
public static void main(String[] args){
MyEnum m = MyEnum.A;
System.out.println(m.getI());

     MyEnum m2 = MyEnum.B;  
     System.out.println(m2.getI()); 
     System.out.println(m2.fazNada());  

 }  

}[/code]

o código acima funciona e no

         System.out.println(m2.fazNada());  

imprime “método da constante”. Ou seja, me parece que tem que sobrescrever realmente. Sem sobrescrever, não consegui acessar, dá o erro “cannot find symbol method fazNada()”

Abraço!

Realmente, sobreescrevendo funciona (como o primeiro método getI() ), porém como ele permite compilar da forma que eu mostrei e sendo um método público eu esperava que eu conseguisse acessar um método “a mais” quando fosse um enum do tipo “B”.