Как сравнить два перечисления? - PullRequest
2 голосов
/ 28 мая 2020

У меня есть два перечисления:

public enum UserType {
    USER,
    EMPLOYER

}
public enum UserDetails {
    USER,
    EMPLOYER
}

Я пытаюсь сравнить это следующим образом:

if(UserType.USER.equals(UserDetails.USER)){
    return true;
}

но я не могу, потому что мой equals() бросает меня это:

equals() between objects of inconvertible types 'UserType' and 'UserDetails'

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

Ответы [ 2 ]

6 голосов
/ 28 мая 2020

Различные типы

Перечисление в Java - это класс , хотя и немного особенный вид класса. Класс определяет тип .

Если не связаны наследованием или интерфейсом , разные типы нельзя сравнивать на равенство. String не может быть равно LocalDate, что не может быть равно DataSource.

Аналогично, объект enum UserType не может быть равен объекту enum UserDetails. Яблоки апельсинам Не равны по определению. Итак, ваш вопрос технически бессмысленен.

Тот факт, что некоторые классы перечислений имеют общие имена для некоторых из своих констант, не имеет значения, это просто совпадение, что ваши два перечисления имеют общие имена USER или EMPLOYER. Перечисление Month в комплекте с Java определяет константу с именем APRIL. Я мог бы определить другое перечисление с объектом, также названным APRIL. Но это не делает их равными.

Ответ на этот вопрос предполагает, что у вас есть проблема с вашим дизайном. Возможно, вам стоит опубликовать еще один вопрос по этой проблеме дизайна, если она уже решена в Stack Overflow. Как прокомментировал Каяман , ваш вопрос выглядит как проблема XY .

Другие ответы, предлагающие вам:

  • Сравните строки имена констант перечисления.
  • Сравните порядковое положение констант в определении перечисления.

… ошибочно. Эти подходы нарушают цель перечислений в Java, которая заключается в обеспечении типобезопасной идентичности определенных значений, известных во время компиляции .

  • Если вы сравниваете имена констант, тогда вы могли бы использовать простые String объекты, а не перечисления.
  • Если вы сравниваете порядковые числа , тогда вы можете использовать простые целые числа, а не перечисления.

Оба случая - fr agile, что приводит к сбоям во время выполнения, если вы вносите изменения в одно перечисление без сопоставления с другим. И в обоих случаях вы потеряли полезность перечисления, преобразовав перечисление в запутанный уровень косвенного обращения к строке или int.

5 голосов
/ 28 мая 2020

Попробуйте сравнить их имена

if(UserType.USER.name().equals(UserDetails.USER.name())){
    return true;
}

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

  • Используйте только один тип перечисления - я думаю, идеально (но у автора разные перечисления)
  • Сравните имена перечислений - ну, это работает, но на самом деле не "умное" использование enum
  • Сделайте какое-нибудь сопоставление - почему бы и нет - но его жесткое связывание двух разных перечислений, и этого недостаточно
enum UserType {
   USER,
   EMPLOYER;

   public boolean isLike(UserDetails details) {
       switch (this) {
           case USER:
               return details == UserDetails.USER;
           case EMPLOYER:
               return details == UserDetails.EMPLOYER;
       }
       return false;
   }
}

enum UserDetails {
   USER,
   EMPLOYER;
}

if(UserType.USER.isLike(UserDetails.USER)){
           // do something
}

Итак, мы видим, что нет лучшего решения, чем переписать код и сделать только один enum. Но все зависит от проблемы:

  • Мы не знаем, почему существует два перечисления - возможно, автор поддерживает устаревший код
  • Мы не знаем, почему автор должен сравнивать эти разные enums
  • Решает ли предлагаемое решение данную конкретную проблему - да . Это хорошо - нет
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...