Java перечислимые и дополнительные файлы класса

Если Вы хотите знать структуру таблицы, индексы и ограничения:

sp_help 'TableName'
63
задан Community 23 May 2017 в 11:33
поделиться

3 ответа

Файлы $ 1 и т. Д. Возникают, когда вы используете функцию "реализации метода для каждого экземпляра" перечислений Java, например:

public enum Foo{
    YEA{
        public void foo(){ return true };
    },
    NAY{
        public void foo(){ return false };
    };

    public abstract boolean foo();
}

Вышеупомянутое создаст три файла классов, один для базового enum class и по одному для YEA и NAY для хранения различных реализаций foo ().

На уровне байт-кода перечисления - это просто классы, и для того, чтобы каждый экземпляр перечисления реализовал метод по-разному, должен быть разные классы для каждого экземпляра,

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

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

6
ответ дан 24 November 2019 в 16:28
поделиться

В Java перечисления на самом деле представляют собой просто классы с добавлением некоторого синтаксического сахара.

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

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

Если пространство является премиальным, вы всегда можете просто использовать вместо него Константы.

1
ответ дан 24 November 2019 в 16:28
поделиться

насколько мне известно, учитывая перечисление с именем Operation , вы получите дополнительные файлы классов, за исключением очевидного Operation.class , и по одному на перечисление значение, если вы используете абстрактный метод , например этот:

enum Operation {

   ADD {
      double op(double a, double b) { 
          return a + b;
      }
   },

   SUB {
      double op(double a, double b) { 
          return a - b;
      }
   };

   abstract double op(double a, double b);
}
-1
ответ дан 24 November 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: