Sobes.tech
Junior

O que é um modificador de acesso 'protected' numa linguagem de programação e em que casos deve ser utilizado?

sobes.tech IA

Resposta da IA

protected — é um modificador de acesso que permite que os membros de uma classe (campos, métodos) sejam acessíveis dentro da própria classe, nas classes herdadas (mesmo que estejam em um pacote diferente) e em todas as classes do mesmo pacote.

Aplicação:

É usado quando se deseja fornecer acesso aos membros da classe apenas aos seus herdeiros e a outras classes no mesmo pacote, ocultando-os do mundo exterior fora desse pacote e da hierarquia de herança.

Exemplos de cenários de uso:

  • Quando a classe pai contém campos ou métodos que fazem parte da sua implementação interna, mas são necessários para expandir a funcionalidade nas classes herdadas.

    public class Animal {
        protected String name; // Disponível para herdeiros e classes no mesmo pacote
    
        protected void eat() { // Disponível para herdeiros e classes no mesmo pacote
            System.out.println(name + " está a comer.");
        }
    }
    
    public class Dog extends Animal {
        public void bark() {
            System.out.println(name + " está a ladrar."); // Acesso ao campo protected name
            eat(); // Acesso ao método protected eat()
        }
    }
    
  • Quando num pacote há um grupo de classes estreitamente relacionadas, e é necessário que tenham acesso aos elementos internos umas das outras, mas escondendo esses elementos de classes de outros pacotes. Nesse caso, protected funciona de forma semelhante ao modificador padrão (package-private) para classes no mesmo pacote, mas também abre o acesso para herdeiros de qualquer pacote.

    // Pacote com.example.core
    package com.example.core;
    
    public class BaseConfig {
        protected int threshold = 10; // Acessível a classes em com.example.core e herdeiros de qualquer pacote
    }
    
    // Pacote com.example.app (pode estar em outro pacote)
    package com.example.app;
    
    import com.example.core.BaseConfig;
    
    public class AppConfig extends BaseConfig {
        public void displayThreshold() {
            System.out.println("Threshold: " + threshold); // Acesso ao campo protected de outro pacote
        }
    }
    
    // Pacote com.example.core
    package com.example.core;
    
    public class RelatedConfig {
         public void printBaseThreshold(BaseConfig config) {
             System.out.println("Base Threshold de RelatedConfig: " + config.threshold); // Acesso ao campo protected no mesmo pacote
         }
    }
    

Evite o uso excessivo de protected, pois isso pode complicar a refatoração e violar a encapsulação, permitindo que herdeiros ou classes no mesmo pacote manipulem diretamente o estado interno do objeto. É preferível usar private com métodos getter/setter públicos, se a herança direta e o acesso à implementação interna não forem o objetivo principal.