Перечислитель сравнения Java (странное поведение) - PullRequest
1 голос
/ 15 июня 2011

Я работаю с проектом Java и Eclipse (версия 3.6.2) в качестве IDE, при сравнении перечислений я получаю странное поведение, следуя примеру странности:

Глобальная переменная:

StatusType status = StatusType.SIGNATURE;

Код:

                String trsStatus = "END";
            if(trsStatus.equals("END") && (this.status.compareTo(StatusType.SIGNATURE) != 0)){
                //Do something
                }

Это сравнение успешно и введите в блок if, Почему?В этом случае вторая оценка (this.status.compareTo (StatusType.SIGNATURE)! = 0) операторов if не удалась, поскольку результат ложен!Почему java, однако, входит в блок ???

Если я вычисляю выражение в наблюдателе выражений отладчика eclipse, значения операторов:

trsStatus.equals ("END") ---> true

(this.status.compareTo (StatusType.SIGNATURE)! = 0) ---> false

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

boolean sign = (this.status.compareTo(StatusType.SIGNATURE) != 0);

я получаю такой результат:

(this.status.compareTo (StatusType.SIGNATURE))! = 0) ---> false

sign ---> true

Почему?!?

Как это возможно?

Ответы [ 5 ]

2 голосов
/ 15 июня 2011

this.status.compareTo(StatusType.SIGNATURE) != 0 вернет ноль, потому что ноль означает, что они равны. compareTo() возвращает 1, -1 или 0 в зависимости от того, какое значение считается большим.

2 голосов
/ 15 июня 2011

Может быть, StatusType переопределяет compareTo() каким-то странным образом?

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

В любом случае вам следует использовать equals() или даже == вместо compareTo() здесь.

1 голос
/ 15 июня 2011

Единственная разумная причина, которую я мог себе представить, это то, что

this.status != StatusType.SIGNATURE

Период. Вы, вероятно, неосознанно устанавливаете статус на какое-то другое значение. Может быть, с другой веткой. Кто знает. Что оценивает статус в вашем отладчике?

В любом случае, в Java нет такой "ошибки". Если вы не отправите еще код, который доказывает это; -)

0 голосов
/ 15 июня 2011
public class Test {
    public static void main(String[] args) {
        TestEnum e = TestEnum.SIGNATURE;
        System.out.println(e.compareTo(TestEnum.SIGNATURE));
        String test = "test";
        if (test.equals("test") && e.compareTo(TestEnum.SIGNATURE) != 0) {
            System.out.println("I'm here");
        }
    }
}

Я сделал следующий тест.Он не входит в блок if и печатает «Я здесь».

Можете ли вы опубликовать свой фрагмент?

0 голосов
/ 15 июня 2011

Вы должны использовать: this.status != StatusType.SIGNATURE.

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