Никогда не используйте общедоступные вложенные перечисления? - PullRequest
14 голосов
/ 11 ноября 2010

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

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

Ответы [ 3 ]

13 голосов
/ 11 ноября 2010

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

Первый вопрос. Где ты наткнулся на этот совет? Они предоставили какое-либо обоснование?

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

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

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

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

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

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

0 голосов
/ 11 ноября 2010

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

...