Maison >Java >javaDidacticiel >Java peut-il imiter le concept « ami » de C ?

Java peut-il imiter le concept « ami » de C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-08 08:42:01369parcourir

Can Java Mimic C  's

Java peut-il émuler le concept « ami » de C ?

En C, le concept « ami » permet aux classes de différents packages d'accéder méthodes privées et protégées des autres classes. En Java, il n’existe pas d’équivalent direct à cette fonctionnalité. Cependant, une solution de contournement intelligente peut simuler le concept « ami ».

Comment simuler « ami » en Java

La clé de cette solution de contournement consiste à utiliser un niveau de classe identifiant secret. Imaginons que nous ayons deux classes de packages différents : Roméo et Juliette. Roméo souhaite accéder aux méthodes non publiques de Juliet sans étendre sa classe.

Dans le package de Roméo :

public class Romeo {
    public static final class LoveIdentifier {
        private LoveIdentifier() {}
    }
    private static final LoveIdentifier loveIdentifier = new LoveIdentifier();
    
    public void cuddleJuliet(Juliet.LoveIdentifier loveIdentifier) {
        // ...
    }
}

Roméo définit une classe statique imbriquée LoveIdentifier avec un constructeur privé. Cette classe sert d'identifiant secret qui permet à Roméo d'accéder aux méthodes privées de Juliet.

Dans le package de Juliet :

public class Juliet {
    public static final class LoveIdentifier {
        private LoveIdentifier() {}
    }
    private static final LoveIdentifier loveIdentifier = new LoveIdentifier();
    
    public void beCuddled(Romeo.LoveIdentifier loveIdentifier) {
        // Allow Romeo to access private methods using the identifier
    }
}

Juliet définit également une classe LoveIdentifier identique pour correspondre à celle de Roméo. Lorsque la méthode beCuddled de Juliet est appelée, elle vérifie si le LoveIdentifier transmis correspond au sien. Si c'est le cas, il accorde à Roméo l'accès à ses méthodes privées.

À l'aide de la simulation « Ami »

Désormais, Roméo peut interagir avec Juliette en fournissant le LoveIdentifier partagé comme un argument :

Romeo romeo = new Romeo();
Juliet juliet = new Juliet();
romeo.cuddleJuliet(juliet.loveIdentifier);

Puisque Roméo transmet le bon LoveIdentifier, il peut accéder aux méthodes privées de Juliette, simulant efficacement la relation « ami » de C.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn