Sobreescrita de método em Enum

5 respostas
F

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?

5 Respostas

L.Bach

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.

F

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…

F

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)

L.Bach

Fausto,

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

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!

F

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”.

Criado 20 de janeiro de 2009
Ultima resposta 20 de jan. de 2009
Respostas 5
Participantes 2