7
votes

Pourquoi est-il autorisé à accéder à un domaine privé d'un autre objet?

Récemment, j'ai observé un comportement inattendu d'accéder aux champs de priavets en Java. Considérez l'exemple suivant, qui illustre le comportement:

public class A {

    private int i;  <-- private field!

    public A(int i) {
        this.i = i;
    }

    public void foo(A a) {
        System.out.println(this.i);  // 1. Accessing the own private field: good
        System.out.println(a.i);     // 2. Accessing private field of another object!
    }

    public static void main(String[] args) {
        (new A(5)).foo(new A(2));
    }
}


1 commentaires

Veuillez utiliser le formatage du code pour le code, l'entrée / la sortie et les documents structurés tels que HTML ou XML. Pour ce faire, sélectionnez l'exemple et cliquez sur le bouton {} au-dessus du formulaire d'affichage / édition messagé.


3 Réponses :


13
votes

Champs privés Protégez une classe, pas une instance. L'objectif principal est de permettre à une classe d'être mise en œuvre indépendamment de son API. Les instances isolantes entre eux-mêmes ou protéger le code de l'instance du code statique de la même classe n'apporteraient rien.


3 commentaires

@ Markotopolnik Numéro de pratique Dans la pratique, j'ai même observé que les gens préfèrent uppoter lorsqu'ils voient la photo d'un utilisateur. Une réponse CW rassemble moins de upvotes et moins d'acceptation (je ne peux pas dire avec certitude les bowvotes). Si vous pensez que c'est mauvais, vous pouvez le réparer, cependant.


@Dystroy je n'ai certainement aucune raison de penser que c'est mauvais, juste très inhabituel. Comment décidez-vous quand en faire une réponse CW? L'ensemble de la fonctionnalité est là principalement comme une mesure contre les exploits, comme en faisant constamment de petites modifications à votre réponse pour l'amener au sommet de la liste récente active, dans l'espoir de garner plus d'attention => upvotes.


@Markotopolnik Eh bien, quand, sur une question facile, je pense que je serai avancé et / ou accepté principalement parce que j'étais le premier à répondre parmi les codeurs expérimentés, je marque souvent ma réponse en tant que cw. Cela facilite également les autres utilisateurs de l'améliorer. Je ne fais pas de règle ni de prétendre que d'autres utilisateurs devraient faire la même chose, cependant.



3
votes

C'est parce qu'ils sont de la même classe. Ceci est autorisé en Java.

Vous aurez besoin de cet accès à plusieurs fins. Par exemple, dans une implémentation d'égaux: xxx


2 commentaires

Vous n'avez pas nécessairement besoin cela, mais cela en fait un peu moins verbeux d'y accéder.


@NOOBUNCHAINAINAINE: Tous vos champs privés ont-ils des accesseurs publics? Quel est le point d'encapsulation si c'est le cas?



0
votes

La méthode FOO appartient à la même classe que la variable IELI n'a aucun mal à permettre un tel accès.


0 commentaires