web-dev-qa-db-fra.com

Est-il possible de faire des méthodes invisibles / non utilisables à certaines classes de Java?

Je développe une application en Java== Où j'aimerais transmettre un objet dans le cadre d'une interface dans d'autres méthodes de classes écrits par d'autres développeurs de l'équipe. L'objet que je passe a setters and getters de la manière normale, mais je ne veux pas que certaines des classes écrites par d'autres d'autres accéder à certaines des Setters de l'objet passés (différentes régleuses seraient disponibles pour différentes classes lorsqu'ils utilisent l'objet). Est-ce que cela est possible. En Java? C'est-à-dire de définir les classes pouvant utiliser quelles méthodes d'autres classes sur une base par classe?

Je suppose que je voudrais faire est quelque chose comme:

someObject.method(passInObject[but don't give access to passInObject.thisSetter])

Où 'Toeobject' est un objet d'une classe écrite par un membre de l'équipe et "PassinObject" est un objet de ma classe, mais je tiens à protéger certains des membres de cette classe de quelque manière spécifique.

Je suppose que non et je devrai utiliser l'héritage pour remplacer ces constructeurs, je ne veux pas d'autres modules spécifiques à utiliser/voir, mais il semble que Clunky ait une nouvelle classe héritée par classe en utilisant la classe basée sur la protection des valeurs internes à partir de certains utilisant des cours. Je pouvais faire un contrôle dans le code que la valeur d'un membre n'a pas été changée, mais elle est trop tardive et les dommages sont endommagés (l'annulation peut être coûteuse). Je pourrais vérifier le nom de la classe dans la méthode Setter lui-même et ne rien faire si le nom est sur une liste "banni", mais cela semble très enclenchy et une erreur d'erreur aussi. Ce que je veux, c'est le code d'appel pour restreindre quels membres peuvent être appelés dans l'objet passé.

Ou je manque quelque chose et il y a un modèle commun pour faire face à cela?

2
David Scholefield

Cacher des méthodes héritées est une idée terrible et presque garantie de vous faire du chagrin.

Je dirais que c'est ce qui interfaces sont pour; Un "accord de divulgation" entre deux classes ou plusieurs classes décrivant avec précision ce que chacun est autorisé à connaître l'autre [S].

Bien sûr, cela obtiendra juste un acarien fidulaire si son mixte avec héritage comme vous le décrivez - si votre classe de base implique l'interface ou si chaque classe dérivée doit-elle faire Pour lui-même? Ymmv.

5
Phill W.

Il est possible que votre erreur prenne une approche trop fine à grain de l'accès. Êtes-vous certain que chaque utilisateur de votre classe aura un accès différent? Peut-être que votre problème réel est que vous devriez mettre en œuvre un mécanisme Role lorsque seul un utilisateur ayant un rôle spécifique peut avoir accès à certaines méthodes.

Un mécanisme Role peut être mis en œuvre à l'aide de différentes interfaces ou même en utilisant un proxy pour un réel contrôle à grain fin.

0
OldCurmudgeon