Duvida Certificaçao (enum)

Galera eu comprei o livro scjp 6 (Kathy Sierra) e no exercicio 7 do capitulo 3 tem
o seguinte codigo:

	  public class Bridge{	
               public enum Suits{ // declaraçao enum
			 CLUBS(20),TESTE(30){
			 public int getValue ( int bid ){ // aki é um método?
			  	return ((bid-1)*30)+40;
			  }
			};
			
		Suits(int points){
			this.points = points;
		}
		
		private int points;
		
		public int getValue ( int bid ){ // esse método tem a msm assinatura do anterior
			  	return (points*bid);
			  	//return ((bid-1)*30)+40;
			  }			
		}
           }

a dúvida é com relaçao ao metodo: public int getValue ( int bid ){}
pq nao da erro se ambos tem a msm assinatura?

Porque o primeiro método é membro do enum, enquanto o segundo é membro da classe Bridge.

Olá, cara roda esse código com um exemplo mais ou menos assim:

	public static void main(String... args) {
		
		Suits teste = Suits.TESTE;
		System.out.println(teste.getValue(1));
		
		Suits clubs = Suits.CLUBS;
		System.out.println(clubs.getValue(3));
	}

Como o amigo aí em cima disso, o primeiro método é membro da enum declarado da forma NestedInnerClass, ou seja, aninhado. Sendo que o termo aninhado pode ser entendido como um método dentro de outro, dentro de uma enum (como é neste caso), dentro da lista de argumentos de um método.

Enfim, quando você invocar o “getValue(…)” com uma referência do Suits.TESTE você irá invocar o método que está aninhado com a declaração desse valor na Enum e pensando dessa forma, como nenhum método foi aninhado com o valor de Suits.CLUBS você irá invocar o método que faz parte (membro) da classe.

NestedInnerClass sempre estará associado com algum outro membro de uma classe, como dito antes, um outro método, na lista de argumentos de um método ou em uma Enum.

Abs.

Vamos ver o código:

public class Bridge{	
    public enum Suits{ // declaraçao enum
        CLUBS(20), TESTE(30) {
            public int getValue (int bid) { // aki é um método?
                return ((bid-1)*30)+40;
            }
        };

        Suits(int points) {
            this.points = points;
        }

        private int points;

        public int getValue (int bid){ // esse método tem a msm assinatura do anterior
            return (points*bid);
            //return ((bid-1)*30)+40;
        }			
    }
}

O segundo getValue está na classe Suits (ou mais precisamente Bridge.Suits). A classe Suits é um enum, mas isso não importa para o método.

O elemento TESTE tem um corpo, pois seguem-se {}. Assim, ele vai ser de uma classe anônima especial, que será subclasse de Suits. O compilador provavelmente vai chamar essa classe anônima de Bridge$Suits$1. Ao compilar o código você vai notar que surgirá um arquivo “Bridge$Suits$1.class”. TESTE não será um membro direto da classe Suits e sim dessa subclasse anônima. No entanto CLUBS não tem nada de especial, e portanto ele será um membro direto de Suits. Isso daí pode ser comprovado ao invocar-se System.out.println(Bridge.Suits.CLUBS.getClass()) e System.out.println(Bridge.Suits.TESTE.getClass()).

O primeiro getValue está no elemento TESTE, que é uma subclasse anônima de Suits. O que acontece quando você coloca na subclasse um método com a mesma assinatura da superclasse? Ocorre um override (sobrescrita de métodos). Portanto, o primeiro getValue é um override do segundo.

eu acho que complicaram na resposta.
eu vejo de uma forma mais simples, o método getValue está sendo sobrescrito por TESTE, sendo assim, se vc chamar o método getValue de CLUBS o método do enum vai ser chamado e se chamar de TESTE o seu método vai ser chamado. Veja também que o método de TESTE está sujeito as regras de sobrescrita de métodos.

[quote=pablouu]eu acho que complicaram na resposta.
eu vejo de uma forma mais simples, o método getValue está sendo sobrescrito por TESTE, sendo assim, se vc chamar o método getValue de CLUBS o método do enum vai ser chamado e se chamar de TESTE o seu método vai ser chamado. Veja também que o método de TESTE está sujeito as regras de sobrescrita de métodos.[/quote]

Eu também acho q é exatamente isso…

Primeiramente obrigado!!
Na verdade é apenas um método sobrescrito…apos
rever algumas regras:

  • Um metodo sobrescrito deve ter o msm tipo de retorno ou um subtipo;
  • Um método sobrescrito deve manter a msm lista de argumentos;
    Obs: na verdade eu tinha confundido com sobrecarga que deve ter lista
    de argumentos diferentes…por isso a pergunta sobre a assinatura.

Creio que seja isso msm!!
vlw!!