IDE рекомендует перейти с финального класса на Enum - PullRequest
0 голосов
/ 03 мая 2018

В своей кодовой базе я нашел такой класс:

public final class Klass
{
   private static final long LONG_NUMBER = 10.0;

   private Klass() {}

   public static double calcSomethingUsingLongNumberAndParam(double param)
   {
     ...
     return something;
   }
}

My IDE (IntelliJ IDEA) предлагает одно «улучшение» для этого класса - измените его на enum. В качестве теста я внес изменение и отметил, что никаких других рефакторов не было сделано ни для одного из полей или методов-членов, а также для каких-либо обращений к содержащимся статическим методам.

Вот сгенерированный Enum:

public enum Klass
{
   ;
   private static final long LONG_NUMBER = 10.0;

   private Klass() {}

   public static double calcSomethingUsingLongNumberAndParam(double param)
   {
     ...
     return something;
   }
}

Есть ли какая-то польза от изменения окончательного класса на enum, или это изюминка IDE?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Нет прямой выгоды от изменения этого класса на перечисление.

Единственное, что он предоставляет вам, - это возможность опустить приватный конструктор (и final в классе).

Но вам также понадобится либо одно значение (которое вам не нужно), либо просто случайное зависание ;, чтобы отделить (пустой) список значений от остальной части тела класса.

0 голосов
/ 03 мая 2018

В моем ответе первоначально говорилось, что, безусловно, есть преимущества, перечисления заменяют синглтоны POJO старого стиля (что является частным случаем) почти во всех отношениях. Тем не менее, это немного зависит от варианта использования и реального кода. Если вы просто замените «final class» на «enum», как, кажется, делает в этом случае IDE, преимущества будут минимальными. Кроме того, одним из основных преимуществ использования enum является лучшая проверка типов для конечных значений, но, поскольку вы, похоже, используете только одно числовое значение, и оно является закрытым, здесь это бесполезно.

Плюсы использования класса enum против константы:

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

Минусы:

  • Сам по себе класс enum является окончательным, но его внутренний дизайн зависит от возможности создания подклассов для значений enum, поэтому их защита от подклассов кажется мне несколько странной.

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

Подробнее о преимуществах перечислений см. Что такое перечисления и почему они полезны? . Существует также другое обсуждение преимуществ наличия последнего ключевого слова в постоянном служебном классе, таком как ваш: Последнее ключевое слово в постоянном служебном классе - вывод, который я получаю из этого обсуждения, состоит в том, что единственное преимущество состоит в том, что оно категорически запрещено подклассировать его, что в любом случае не сработает, поскольку вы не сможете переопределить статический материал.

TLDR; рекомендация заменить на enum кажется разумной, по крайней мере, если вы пропустите то, что не нужно явно объявлять с enum. Однако различия связаны с удобочитаемостью и ремонтопригодностью, а не с различиями в поведении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...