2010-11-10 37 views
13

Je suis récemment tombé sur une norme de codage affirmant que vous devriez jamais utiliser public enums/classes internes en Java. C'est la première fois que j'ai rencontré cette convention, et je n'ai pas réussi à trouver une explication satisfaisante pour savoir pourquoi.N'utilisez jamais d'énumérations publiques imbriquées?

Je comprends pourquoi les classes internes publiques devraient être évitées, mais pour quelles raisons n'utiliseriez-vous jamais des énumérations publiques imbriquées? Ou, pourquoi est-ce une mauvaise convention à suivre?

+0

Où avez-vous lu à ce sujet? pouvez-vous pointer vers cet article? –

+2

Quand vous dites que vous avez "rencontré" ce stadard. Comment et où. Sûrement, partout indiqué, il aurait donné un certain raisonnement. – David

+0

Malheureusement, je ne peux pas créer un lien vers la source car il s'agissait d'un e-mail interne à l'entreprise. Le raisonnement était bref et a mentionné le fait de faciliter le débogage et de suivre les conventions de Java. – AEW

Répondre

12

Clause de non-responsabilité:Ce qui suit ne sont pas des règles strictes. Ce ne sont que mes opinions et préférences personnelles. Personnellement, je trouve que cela rend mon code plus facile à lire et plus facile à maintenir.

D'abord une question. Où avez-vous rencontré ce conseil? Ont-ils fourni une justification? D'après mon expérience, j'ai normalement utilisé des énumérations imbriquées privées pour améliorer la lisibilité et la maintenabilité de mon code. Cela est particulièrement important lorsque vous effectuez une intégration avec un autre système et que vous devez envoyer des chaînes ou des nombres spécifiques. Je trouve que l'utilisation d'une énumération rend les choses plus faciles à lire et à maintenir. Dans ce cas précis, l'information transmise par l'énumération est limitée à la classe (c'est-à-dire qu'elle n'a aucun sens en dehors de la classe et personne d'autre ne devrait en avoir besoin).

Je ne peux pas penser à une raison définitive qui dit pourquoi les énumérations internes publiques sont une mauvaise pratique. Mais voici les raisons pour lesquelles je ne suis pas (normalement) les utiliser:

  • Si l'ENUM est publique, cela signifie essentiellement qu'il transmet l'information dans une plus grande portée (par exemple, est logique en dehors de la portée de la classe parente et cela signifie probablement que d'autres choses l'utilisent). Si tel est le cas, alors il pourrait être plus logique d'en faire une énumération autonome. Je trouve ThirdPartyResponseCodes.Success plus facile sur les yeux plutôt que ThirdPartyIntegrationInterface.ThirdPartyResponseCodes.Success. Il n'y a aucune raison pour laquelle vous ne pouvez pas nommer l'énumération de manière appropriée pour fournir un contexte et en faire ainsi une énumération autonome.
  • J'imagine que les mêmes raisons de ne pas utiliser les classes internes publiques s'appliquent également aux énumérations publiques internes. Tout d'abord, si vous avez une classe interne, cela peut signifier que votre classe externe pourrait bénéficier d'un refactoring. Peut-être votre classe extérieure essaie-t-elle d'en faire trop?D'un autre côté, il y a l'avantage de l'encapsulation et de la limitation de la portée, surtout si vous pouvez faire valoir que la classe interne n'a de sens que dans le contexte de la classe externe (ce qui devrait aller de soi). S'il s'agit d'une classe interne publique, cela signifie probablement que sa portée s'étend au-delà de la classe externe et qu'elle devrait donc être retirée.
  • Si vous avez vraiment besoin d'utiliser une énumération imbriquée publique, vous devez documenter exactement pourquoi vous en auriez besoin (je n'ai pas encore trouvé de raison de le faire) et pourquoi il est préférable de le laisser comme enum et non une énumération publique autonome.
+0

Je suis un collègue d'AEW. En ce qui concerne le point 3, la classe en question était une classe de longueur unitaire basée sur le modèle du java TimeUnit, mais elle contenait également la valeur interne (dans l'unité native). J'ai senti que c'était un cas assez clair d'encapsulation et de limitation de la portée. – swarfrat

0

La raison est probablement que cela rend ces enums difficiles à utiliser en dehors de la classe dans laquelle ils sont déclarés, puisque vous devez les qualifier avec le nom de la classe englobante. C'est la même chose pour toute classe interne publique, bien sûr. Et je ne suis pas sûr d'être d'accord avec moi - certainement pas comme une règle absolue.

0

Vous devrez demander à la personne qui a écrit cette norme de codage, si elle ne contient pas d'explication. Cependant, cette déclaration de la vôtre est un peu confus:

Je comprends pourquoi les classes internes publiques doivent être évités, mais pour quelles raisons voulez-vous ne jamais utiliser publiques énumérations imbriquées?

Pourquoi pensez-vous que les classes internes publiques devraient être évitées? Et pourquoi cette raison ne s'appliquerait-elle pas aux enums?

+0

Voir http://onjava.com/pub/a/onjava/excerpt/HardcoreJava_chap06/index.html. Les classes internes ont des constructeurs impairs lorsqu'elles sont utilisées en dehors de la classe conteneur. Ceci est différent des classes internes imbriquées (c'est-à-dire statiques), qui sont le comportement d'une énumération imbriquée. – AEW

+0

C'est plus un commentaire qu'une réponse. –