2010-11-10 5 views
13

Я недавно натолкнулся на стандарт кодирования, утверждающий, что вы должны никогда использовать общественный внутренний enums/classes в Java. Это первый случай, когда я столкнулся с этим соглашением и не смог найти удовлетворительного объяснения того, почему.Никогда не использовать общедоступные вложенные перечисления?

Я понимаю, почему следует избегать публичных внутренних классов, но по каким причинам вы никогда не будете использовать общедоступные вложенные перечисления? Или, почему это плохое соглашение?

+0

где вы узнали об этом? можете ли вы указать на эту статью? –

+2

Когда вы говорите, что вы «натолкнулись» на эту стадарду. Как и где. Конечно, везде, где это было сказано, он дал бы некоторые рассуждения. – David

+0

К сожалению, я не могу ссылаться на источник, поскольку он был в форме внутренней электронной почты компании. Объяснение было кратким и упоминалось, что упрощение отладки и соблюдение java-соглашений. – AEW

ответ

12

Отказ от ответственности:Следующие правила не являются твердыми и быстрыми. Это только мои мнения и личные предпочтения. Я лично считаю, что это упрощает чтение и упрощение кода.

Первый вопрос. Где вы столкнулись с этим советом? Были ли они обоснованы?

По моему опыту, я обычно использовал частные вложенные перечисления для повышения удобочитаемости и ремонтопригодности моего кода. Это особенно вступает в игру, когда вы выполняете интеграцию с другой системой, и вам нужно отправлять определенные строки или номера. Я считаю, что использование перечисления облегчает чтение и обслуживание. В этом конкретном случае информация, передаваемая перечислением, ограничена по охвату классу (т. Е. Она не имеет никакого смысла вне класса, и никто другой не нуждается в ней).

Я не могу думать об определенной причине, которая говорит, почему публичные внутренние перечисления - плохая практика. Но вот причины, почему я не (обычно) использовать их:

  • Если перечисление является публичным, это по существу означает, что он передает информацию в большем объеме (то есть, имеет смысл за рамки своего родительского класса и поэтому это, вероятно, означает, что другие вещи используют его). Если это так, то может иметь смысл сделать это автономным перечислением.
  • Я нахожу его ThirdPartyResponseCodes.Success легче на глазах, а не ThirdPartyIntegrationInterface.ThirdPartyResponseCodes.Success. Нет причин, по которым вы не можете правильно назвать перечисление для предоставления контекста и, таким образом, сделать его автономным перечислением.
  • Я бы предположил, что те же причины не использовать общедоступные внутренние классы также применимы к общедоступным внутренним перечислениям. Прежде всего, если у вас есть внутренний класс, это может означать, что ваш внешний класс может извлечь выгоду из рефакторинга. Возможно, ваш внешний класс пытается сделать слишком много?Однако с другой стороны, существует преимущество инкапсуляции и ограничения области, особенно если вы можете сделать аргумент о том, что внутренний класс имеет смысл только в контексте внешнего класса (который должен идти, если не говорить, если он является конфиденциальным). Если это общедоступный внутренний класс, то это, вероятно, означает, что его область действия простирается за внешний класс и, следовательно, ее нужно будет вытащить.
  • Если вам действительно нужно использовать публичное вложенное перечисление, тогда вы должны точно документировать, зачем вам это нужно (я еще не нашел причины для этого), и почему лучше оставить его как публичное вложенное перечисление а не публичное отдельное перечисление.
+0

Я коллега AEW. Что касается пункта 3, рассматриваемый класс представлял собой унифицированный класс длины, основанный на шаблоне java TimeUnit, однако он также содержал значение внутри (в исходном блоке). Я чувствовал, что это довольно ясный случай инкапсуляции и ограничения объема. – swarfrat

0

Причина, по-видимому, в том, что эти переходы трудно использовать за пределами класса, в котором они объявлены, так как вы должны квалифицировать их с помощью имени закрывающего класса. То же самое верно для любого публичного внутреннего класса, конечно. И не уверен, что я соглашусь с этим - конечно, не как жесткое правило.

0

Вам нужно будет спросить человека, который написал этот стандарт кодирования, если он не содержит объяснений. Однако это утверждение ваших несколько сбивает с толку:

Я понимаю, почему государственные внутренние классы следует избегать, но для чего причин не вы никогда не использовать общественные вложенных перечислений?

Почему, по вашему мнению, следует избегать общественных внутренних классов? И почему эта причина не относится к перечислениям?

+0

См. Http://onjava.com/pub/a/onjava/excerpt/HardcoreJava_chap06/index.html. Внутренние классы имеют нечетные конструкторы при использовании вне класса. Это отличается от внутренних вложенных (то есть статических) классов, что и ведет себя вложенных перечислений. – AEW

+0

Это скорее комментарий, чем ответ. –

Смежные вопросы