Je commence avec Java et j'apprends des ensembles, des getters et de l'encapsulation. J'ai un programme très simple, deux classes:
Problème: Je peux changer le tableau INT privé via le getter, je sais que c'est parce que Comment puis-je empêcher conteneur code> a un tableau Int privé (
numarray code>) avec son setter & getter. p> li>
principale code> crée un objet code> objet code> et l'utilise dans
totalacarray code> méthode. p> li>
ul>
getnumarray code> renvoie une référence à
numarray code>, pas le tableau lui-même. Si j'étais intéressé par un seul élément de la matrice, je ferais un getter avec une valeur d'index, mais je souhaite toute la matrice pour la méthode code> TotalArray Code>. p>
numarray code> d'être modifié de sa classe? p> p>
8 Réponses :
Généralement, vous examineriez l'interface que vous essayez de fournir aux appelants de votre classe.
méthodes telles que: p> sont le genre de choses que vous voudriez fournir dans votre classe de conteneurs. Ils interagissent ensuite avec la matrice privée sur le nom de l'appelant. P> Si vous souhaitez renvoyer l'ensemble de la matrice sans permettre de modifier les modifications que vous avez pu copier le tableau dans une nouvelle et renvoie la copie. P > par ailleurs, si vous utilisez les classes de collection Java au lieu du tableau primitif ils fournissent une méthode unmodifiableXXX () (par exemple Collections.unmodifiableList (myList) code>) qui fournissent une lecture seule enveloppe autour de la collection. p> p>
Veuillez corriger vos noms de méthodes. Les méthodes Java commencent par des lettres minuscules et l'objet sont une classe (majuscules).
Merci, c'est ce qui se passe lorsque vous passez une journée à regarder c # ...;)
+1: encapsuler votre tableau par ne pas exposer l'existence de la matrice du tout B>! Faites que le conteneur dispose d'une interface riche qui représente des fonctions réelles de cette classe, plutôt que de simplement renvoyer ses membres de données internes aux appelants à faire avec leur souhait.
Tout ce que vous pouvez faire pour empêcher que les personnes de modifier votre réseau consiste à en fournir une copie de celui-ci dans le getter.
public int[] getArray() { return Arrays.copyOf(numArray, numArray.length); }
«Certains» comme dans la bibliothèque Java standard.
Si vous souhaitez retourner un tableau, vous le cloneriez:
public int[] getArray() { return (int[]) numArray.clone(); }
Encapsulation est le processus de cacher la mise en œuvre. Si la collection stocke ses données dans un tableau ou non est un détail de mise en œuvre; S'il était encapsulé, vous voudriez pouvoir le modifier à un autre type de stockage. P>
Le fait même que vous exposez à l'état (ou à l'état dérivé) lorsque les getters et les setters enfreignent l'encapsulation et implique que vous mettez en place un type de données abstrait plutôt qu'une véritable classe orientée objet. Par exemple, un (code> ArrayList code> est un type de données qui ne représente pas une véritable encapsulation de comportement dans une application. Si c'est ce que vous voulez dépend de la manière dont le type doit être utilisé. P>
Je aurais tendance à créer conteneur code> implémenter
itéroureux
int [] code> ou
Liste
Il y a encore une autre façon, qui ne fait pas une copie du tableau, mais a d'autres inconvénients. Je l'utiliserais pour de très grands tableaux:
Je voudrais suggérer une approche différente de toutes les réponses que j'ai vues ici. C'est pratique lorsque vous envisagez d'encapsulation de penser également à la règle "Ne demandez pas à un objet pour ses données, demandez à un objet de fonctionner sur ses données pour vous". P>
Vous ne m'avez pas donné une utilisation pour Vous créez donc une classe numericvector qui contient un tableau de doubles. Votre NumericVector aurait des méthodes telles que Votre matrice interne est complètement encapsulée - elle ne s'échappe jamais. Toute opération effectuée sur celle-ci est effectuée dans votre classe NumericVector via ces "méthodes commerciales". Comment l'afficher-vous après avoir fonctionné dessus? Avoir Numericvector remplacer Cela indique également quelques éléments à éviter: Ne créez pas automatiquement des setters et des getters, ils brisent votre encapsulation. Vous avez souvent besoin de getters mais, comme les autres ici l'ont dit, vous devez rendre votre getter retourner une version immuable de la matrice. Essayez également de rendre vos cours immuables dans la mesure du possible. Cette méthode que j'ai mentionnée précédemment Le cas où cela (et oo en général) échoue souvent est des bibliothèques - lorsque vous vraiment em> souhaitez ajouter une petite fonctionnalité à votre tableau, mais le laissez toujours comme une matrice à usage général. Dans ce cas, Java ne se soucie généralement pas d'encapsulation du tout, il ajoute simplement une méthode / classe d'assistance pouvant faire des choses à la collecte / matrice (regarder l'objet "tableaux" pour un tas de grands exemples). P > numarray code>, je vais prétendre que votre cible était de créer un "vecteur" numérique à partir de mathématiques (pas de vecteur Java) par exemple. < / p>
multiplierbyscalar (double scalaire) code> et addveur (secondvector secondvector) pour ajouter des éléments. P>
numericvector.tostring () code> de sorte qu'il imprime correctement ou si vous avez une interface graphique, écrivez une classe "contrôleur" pour transférer des données de votre modèle (numérosicvector) à votre vue (GUI). Cela peut nécessiter un moyen de diffuser des éléments de votre numericvector. P>
numericvector.addvector (NumericVector secondvector) code> ne doit probablement pas modifier
numericvector code> mais renvoyer un nouveau numericvector avec la solution. P>
Comment encapsuler un tableau en Java P> blockQuote>
La question peut être suffisamment claire, mais je suppose que le point de oop fort> est de concevoir
une classe comme une entité forte> qui manipule ce tableau et extrait sa propre API. < / p> Si vous persistez, retournez un clone
fort> de la table (forte> / copie défensive forte> est la voie à suivre pour des cas simples fort>. p>
Un moyen efficace de mémoire de la mémoire est ... Ceci permet au immutablelist code> de définir le nombre correct d'éléments dans le tableau de support de la table de support Code> Liste code> et réduit le nombre d'objets intermédiaires créés. p> p>