Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Dúvida] Construtor

Olá, tudo bem? espero que sim.
Num cenário como mencionado na aula pela Jaque, onde definimos o construtor exigindo um parâmetro como nome, por exemplo, e aproveitando o gancho onde podemos fazer isso num título para que tanto filmes e séries devam ter o nome definido, porém por minha regra de negócio eu posso ser capaz de mudar o nome de uma série, mas não de um filme, por exemplo, sei que posso tirar o setNome() de título e deixá-lo apenas em Serie(). Mas, este é o ideal? tem alguma forma de eu dizer "olha, você herdou classe x, mas não necessariamente pode ter método a, mas pode a todos os outros"?
Desde já, obrigado!

1 resposta

Olá, Westes, tudo bem?

Uma abordagem comum para resolver esse tipo de problema é usar a palavra-chave final em métodos que você não deseja que sejam sobrescritos ou utilizados em subclasses. No seu caso, se você não quer que o nome de um filme seja alterado, você pode simplesmente não implementar o método setNome() na classe Filme, ou, se ele for necessário por algum motivo, você pode torná-lo privado ou protegido, dependendo do contexto.

Outra abordagem é usar interfaces ou classes abstratas. Por exemplo, você pode ter uma classe abstrata Titulo com um método abstrato setNome(), que só é implementado na classe Serie e não na classe Filme. Isso garante que apenas séries possam ter seus nomes alterados.

Aqui está um exemplo simplificado de como você poderia estruturar isso:

public abstract class Titulo {
    private String nome;

    public Titulo(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    // Método abstrato que será implementado apenas em Serie
    public abstract void setNome(String nome);
}

public class Filme extends Titulo {
    public Filme(String nome) {
        super(nome);
    }

    // Não implementa setNome, então não pode ser usado
}

public class Serie extends Titulo {
    public Serie(String nome) {
        super(nome);
    }

    @Override
    public void setNome(String nome) {
        // Implementação para permitir a mudança de nome
        super.nome = nome;
    }
}

Com essa estrutura, você garante que apenas Serie pode alterar o nome, enquanto Filme não tem essa capacidade. Isso respeita sua regra de negócio e mantém o código organizado e claro.

Espero ter ajudado e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!