"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso obter acesso limitado a métodos privados em Java sem usar o conceito de “amigo”?

Como posso obter acesso limitado a métodos privados em Java sem usar o conceito de “amigo”?

Publicado em 2024-11-10
Navegar:233

How Can I Achieve Limited Access to Private Methods in Java Without Using the

Fornecendo acesso limitado a métodos privados em Java

Em Java, não é diretamente possível replicar o conceito de "amigo" C, o que permite acesso a membros privados de uma classe para entidades externas. No entanto, um comportamento semelhante pode ser alcançado usando técnicas alternativas.

A abordagem da assinatura de amor

Uma abordagem inteligente para obter acesso controlado é usar uma assinatura "secreta". Veja como funciona:

  1. Crie uma classe pública em um pacote que represente a "assinatura secreta" necessária para acessar os métodos privados em outro pacote. Esta classe de assinatura pode conter um construtor privado para garantir exclusividade.
  2. Na classe que precisa de acesso aos membros privados, defina métodos públicos que aceitam instâncias da classe de assinatura como parâmetros.
  3. Ao chamar o métodos públicos do outro pacote, a instância da classe de assinatura atua como uma "prova" para permitir o invocação.

Exemplo:

Considere duas classes, Romeu e Julieta, de pacotes diferentes. Romeo precisa acessar métodos privados em Julieta sem torná-lo uma subclasse.

Código de Julieta:

// Capulet package
public class Juliet {

    public static void cuddle(Romeo.Love love) {
        Objects.requireNonNull(love);
        // Juliet's private methods can be accessed here.
    }
    
}

Romeo.Love é uma classe pública com um construtor privado, garantindo que apenas Romeo possa criar uma instância.

Código de Romeo:

// Montague package
public class Romeo {

    public static final class Love { private Love() {} }
    private static final Love love = new Love();

    public static void cuddleJuliet() {
        Juliet.cuddle(love);
    }
}

Essa abordagem aproveita a exclusividade do construtor da classe de assinatura para conceder acesso seletivo aos métodos desejados, mantendo o encapsulamento e a privacidade.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3