Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Como funciona o atributo "private String categoriaOmdb;" do enum Categoria?

O atributo "private String categoriaOmdb;" do enum Categoria é dividido entre todas as constantes existentes? Tipo, cada uma das constantes tem seu próprio "categoriaOmdb" com um valor diferente? Qualquer atributo de um enum, é na verdade, um atributo para cada uma das constantes do enum? Como exatamente o valor está sendo colocado dentro de cada uma das constantes do enum? Achei mal explicado no video, tudo foi passado por cima como se fossem coisas obvias que já tínhamos visto anteriormente. Depois achei que seria melhor abordado no artigo seguinte "Para saber mais: um tipo diferente de modelar dados", mas também não foi. Podem me explicar melhor essa parte teórica dos enums? E adicionar um artigo sobre isso no curso também seria de grande ajuda.

2 respostas
solução!

Oi Gabriel! Tudo bem?

Para deixar mais claro, pense que o enum é uma classe normal do Java. No final das contas, é como se ACAO fosse uma instância dessa classe categoria. No código, seria algo mais ou menos assim:

public class Categoria{
//nenhum atributo por enquanto
}
public class Main{
    public static void main(String args[]){
        Categoria ACAO = new Categoria();
    }
}

Mas na programação, é muito útil ter classes que tenham apenas algumas instâncias possíveis, como essa, de categoria. Por isso, as linguagens de programação criam essa ideia de Enum, que é onde "enumeramos", listamos, todas as instâncias possíveis de uma classe. No nosso exemplo, categoria é uma classe, mas só podemos ter categorias de ação, romance, comédia, drama ou crime. Qualquer outro tipo de categoria está fora do nosso escopo. Por isso, é mais fácil usar o enum do que uma classe normal.

No enum, declaramos todas as instâncias que aquela classe pode ter. Como isso não muda, acaba sendo uma constante, e por isso é escrita em maiúsculo. Ela pode ser acessada fazendo Categoria.ACAO, por exemplo.

Mas lembra que o enum continua sendo uma classe do Java? Ele só tem algo a mais, que é essa declaração de todas as instâncias possíveis, como constantes. Sendo uma classe normal, ele pode ter atributos e métodos. Como cada constante é uma instância já definida do enum, se adicionamos um atributo no construtor do enum, precisamos adicionar em cada constante também. É como se estivéssemos fazendo:

public class Categoria{
    private String categoriaOmdb;

    Categoria(String categoriaOmdb) {
        this.categoriaOmdb = categoriaOmdb;
    }
}
public class Main{
    public static void main(String args[]){
        Categoria ACAO = new Categoria("Action");
    }
}

Só que, ao invés de fazer as coisas na main, estamos aproveitando os recursos do enum para já deixar tudo definido nas nossas constantes.

Assim, eu tenho a classe Categoria, que é uma classe especial, um enum. Nesse enum, tenho valores específicos definidos (ação, romance...). Como esses valores não mudam, podemos representá-los como constantes. Se o meu construtor tem algum atributo e eu estou definindo uma constante, preciso já passar esse atributo como parâmetro no momento de declarar a constante no enum. Por isso, fazemos ACAO("Action").

Quando você declara um atributo dentro de um enum, como private String categoriaOmdb;, cada constante do enum (ACAO, ROMANCE, etc.) pode ter seu próprio valor para esse atributo. Isso é feito através de um construtor no enum que recebe o valor do atributo e o atribui à constante específica. Logo, quando estamos fazendo ACAO("Action") estamos chamando esse construtor.

Espero ter ajudado! Se tiver ficado alguma dúvida na explicação, pode responder por aqui :)

Também agradeço pelo feedback. Vou dar uma olhada no Para Saber Mais que você comentou complementá-lo para ajudar na compreensão. Para exercitar essa parte, recomendo dar uma olhada na lista de exercícios proposta no final da aula. Lá, você pode criar vários enums, que têm seus métodos e atributos definidos.

Abraços e bons estudos!

Ótima explicação, muito obrigado Iasmin