Сравните список значений перечисления с одним перечислением - PullRequest
0 голосов
/ 03 июля 2019

РЕДАКТИРОВАТЬ: немного изменил код, чтобы использовать фактическое перечисление, и я все еще вижу проблему, о которой я говорил.

У меня есть странный сценарий, которого я раньше не видел, следующий код был построен на Java 6 и до того, как я думаю, но я не уверен, так как код был написан еще в 2008 году, и у нас нет способа знать, для какой версии Java этот код был написан в то время, в основном список значений перечисления сравнивается с одним значением перечисления, предполагая, что список будет содержать не более одного значения, и сравнение работало нормально на Java 6 и более ранних версиях (я я не уверен насчет версии) но она терпит неудачу с Java 7

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

ИЗМЕНЕННЫЙ КОД -

public class TestEnum {
    enum Color {
        RED, GREEN, BLUE;
    }

    public static void main(String[] args) {
        List<Color> enums = new ArrayList<Color>();
        enums.add(Color.RED);
        if (enums.equals(Color.RED)) {
            System.out.println("Passed the conditional check!!!");
        } 
        else {
            System.out.println("Failed the conditional check!!!");
        }
    }

Почему приведенная выше условная проверка завершается неудачно, даже если мой список значений перечисления содержит только одну константу Color.RED, и я использую метод сравнения для сравнения? Вышеупомянутый код всегда печатает «Сбой условной проверки».

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

И чтобы ответить на вопрос:

, но теперь я вижу, что сравнение возвращает false, хотя список содержит перечисление ActionEnum.NONE.

Нет, этоне делает.Когда этот внутренний список содержит ActionEnum.NONE, тогда возвращается true и выполнение метода сразу останавливается.

Способ only для этого метода для возврата false:

  • getFormats() возвращает пустой список ИЛИ
  • все объекты Action (извлеченные через getActionEnum()) либо пусты, либо не содержат ActionEnum.NONE

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

for (Format f : getFormats()) 
  for (ActionEnum e : f.getActions()) 
    if (e.getActionEnum == ActionEnum.NONE) 
      return true;
return false;

Редактировать: мой код предполагал, что что-то под названием ActionEnum действительно будет настоящим перечислением.Но, как и в этом случае, == не будет заменено на e.equals () здесь!

По поводу еще одного обновления: другой ответ верен: ваш текущий код имеет someList.равно (что-то, что Notistist) .Это всегда вернет ложь.Вам нужно enums.contains(someEnum) вместо этого.

1 голос
/ 03 июля 2019

Вы сравниваете List и Enum с равными, которые всегда возвращают false.Если вы используете содержит вместо равно , условие будет работать.

if (enums.contains(ActionEnum.NONE)) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...