11
votes

Qu'est-ce que cela signifie pour une méthode d'être public / privé / autre en Java?

Qu'est-ce que cela signifie pour une méthode d'être public / privé / autre en Java?
Quels sont les avantages et les inconvénients de ces options?
Quel est mon impulsion, comme quelqu'un essaie d'être un bon programmeur, de s'en soucier?


6 commentaires

Tutoriel Sun: Java.sun.com/docs/books/Tutorial /java/javaoo/accesscontrol.h tml


Je seconde le tutoriel, ou un tutoriel de base de OOP. Les concepts sont les mêmes pour toutes les langues OO en ce qui concerne l'encapsulation / accès des données.


Que signifie OOP?


Programmation orientée objet .


David, vous avez beaucoup d'apprentissage devant vous. Le tutoriel du soleil peut vous aider doucement dans la bonne direction.


Allez-vous ajouter cela à l'OP? Est-ce ce devoir? Avez-vous déjà traversé le tutoriel? Avez-vous d'autres questions?


6 Réponses :


0
votes

La raison principale est appelée encapsulation: ne donnez pas accès à l'état interne d'objet.


2 commentaires

Pourriez-vous s'il vous plaît entrer dans plus de détails?


Un objet peut avoir un état; Par exemple, il peut avoir les propriétés des couleurs de premier plan et d'arrière-plan modifiables. Cet état serait détenu dans l'objet comme une valeur de certains types de variable (s). La mise en œuvre souhaitera peut-être stipuler les restrictions sur la manière dont les couleurs peuvent changer (par exemple, les deux couleurs peuvent ne pas être identiques). Si les variables étaient publiques et directement accessibles, les utilisateurs peuvent violer la maladie (alias invariant), transition de l'objet dans un état imprévu / illégal. La mise en œuvre peut plutôt rendre les variables privées et permettre des mutations valides via une méthode publique.



1
votes

hle Les modificateurs publics, protégés et privés contrôlent quel autre code peut voir ces méthodes (ou champs). Il s'agit de contrôler l'interface que vous exposez.

Les couramment utiles sont:

Le modificateur public: tout autre peut voir votre méthode.

Le modificateur privé: Aucun code autre que votre classe et toutes les classes intérieures peuvent voir votre méthode.

Celles-ci seraient utiles par exemple si vous vouliez vous assurer qu'il n'y avait qu'une seule instance d'une classe jamais créée ( Singleton modèle ). Vous pouvez créer le constructeur privé, créer une seule instance et le magasin est en tant que membre privé appelé instance et fournir une méthode publique quelque chose comme ceci: xxx

et afin que vous puissiez garantir qu'il n'y aura que chaque instance.


mise à jour - un autre exemple tel que demandé.

Un autre exemple peut être où vous avez une méthode publique compliquée et que vous souhaitez le casser. dans des parties plus simples. Vous pouvez la rompre dans des méthodes simples, chacune faisant partie du travail, mais vous ne voudrez pas que l'autre code appelle ces méthodes de pièce, car elles ne travailleraient pas seules - vous feriez donc les méthodes plus petites privées, garantissant ainsi qu'ils ne peuvent pas être appelés en dehors de votre classe.


3 commentaires

Pourriez-vous s'il vous plaît entrer dans plus de détails sur l'utilité?


MyObject ne pouvait-il pas être invoqué plusieurs fois? Cela n'aurait-il pas conduit la création d'instances mutliples de la classe?


Non - Calling MyObject.GetInstance () ne crée pas de nouvelle instance, il renvoie simplement celui qui a été déjà créé. Les invocations répétées continueront de retourner le même instance.



1
votes

Les méthodes privées peuvent être appelées uniquement à l'intérieur de la classe. Vous pouvez appeler des méthodes publiques de votre classe n'importe où dans le programme. Les méthodes sans modificateur d'accès sont censées avoir une portée de visibilité de paquetage (elle s'appelle par défaut ), vous pouvez donc l'invoquer n'importe où dans le package, où la classe est définie.

voir http://fr.wikipedia.org/wiki/Object_oriented_programming#encapsulation


3 commentaires

Quel est mon impulsion pour le faire pour que une méthode ne puisse être appelée que dans la classe?


Parfois, vous avez une méthode qui n'est nécessaire que dans une classe. Cela peut être une fonction de conversion ou une autre pièce de code supplémentaire.


Il n'est pas toujours conseillé de mettre en œuvre une fonctionnalité exposée via une méthode publique, dans le corps de cette méthode publique elle-même. Une méthode publique peut avoir besoin d'appeler d'autres méthodes pour exécuter son comportement. Ces autres méthodes sont donc destinées à être utilisées internes et doivent être marquées privées.



5
votes

Une méthode publique peut être accessible de partout, une méthode privée uniquement de la même classe. Le principal avantage est le contrôle de l'API d'une classe. Si je ne fais que du public ce qui est nécessaire, je peux changer le comportement interne d'une classe, sans casser le code en fonction de cette classe. Vous devriez vous soucier, car les logiciels changent souvent dans le monde réel (au moins c'est mon expérience et d'autres l'ont aussi) et plus chaque changement se casse, plus vous avez de l'énergie que vous devez mettre en maintenance ou plus votre logiciel est votre logiciel. En fin de compte, c'est une question de coûts.

La possibilité de cacher les internes de votre classe à partir des utilisateurs de cette classe afin d'éviter de casser le code par des modifications ultérieures est souvent appelée encapsulation ou INFORMATION CADIANT .

Les deux options en plus du public et que le package (sans modificateur) et protégé. La méthode accessible par le paquet peut également être accessible à partir de classes du même paquet. Je ne me souviens pas d'avoir utilisé cette option de manière utile. Des méthodes protégées sont accessibles à partir de classes, qui hériter de la classe en question. Qui est souvent utilisé pour créer des classes avec un comportement concret pour une API définie de la classe de base. Par exemple, pourriez-vous mettre en œuvre une nouvelle classe de liste en extensionnant AbstractList et vous n'avez besoin que d'implémenter l'obtention et la taille (et une méthode de configuration pour les listes modifiables). Les autres méthodes exposées par l'API de la liste sont définies dans la classe de base, appelant les trois autres méthodes si nécessaire.


0 commentaires

0
votes

Pour commencer, je voudrais commencer à restreindre le plus possible l'accès possible. Commencez par privé . Si vous avez besoin du constructeur, de la méthode ou du champ d'ailleurs, mais que vous ne pouvez pas y accéder en raison de la restriction, les prochaines étapes seraient alors à vous poser:

  1. Si c'est une méthode, avez-vous vraiment besoin d'y accéder? Cela change-t-il le comportement de la classe / de l'instance? Ne devriez-vous pas laisser cette classe faire le travail? La classe actuelle ne devrait-elle pas être rapportée sur cette classe?
  2. Si c'est un champ, avez-vous besoin d'obtenir ou de définir sa valeur? Ne devriez-vous pas ajouter une méthode qui fait exactement cela?

    Point 1 Évite le mauvais couplage et le point 2 améliore l'encapsulation. Une fois que vous avez examiné ce qui précède et a conclu que moins de restriction est vraiment nécessaire, définissez-la une étape ou plus encore ouverte.


0 commentaires

14
votes

Lorsqu'une méthode est publique forte> cela signifie qu'il est possible d'accéder à d'autres objets

par exemple: p> xxx pré>

la méthode getname code> peut être consulté par d'autres classes car il est public: p> xxx pré>

L'avantage .. Eh bien, vous pouvez l'utiliser à partir d'autres endroits. P>

Lorsqu'une méthode est privée forte>, cela signifie qu'il ne peut être consulté que par des objets de la même classe forte> p>

par exemple, dans cette nouvelle définition: p> xxx pré>

la méthode godetage code> n'est pas accessible par d'autres classes car il est privé, si vous essayez de le faire, le compilateur vous donnera une erreur. MESSAGE: P>

 class David {
      // protected method
      protected int getBalance() { 
          return 1000000; 
      }
      // package protected or "default" method
      boolean knowsOop(){ 
          return true;
      }
 }


0 commentaires