Сравнение объектов класса - PullRequest
20 голосов
/ 15 апреля 2010

Мне нужно сравнить объект Class со списком предопределенных классов.

Безопасно ли использовать == или мне следует использовать equals?

if        (klass == KlassA.class) {
} else if (klass == KlassB.class) {
} else if (klass == KlassC.class) {
} else {
}

Примечание: Я не могу использовать instanceof, у меня нет объекта, у меня просто есть объект Class. Я (неправильно) использую это как перечисление в этой ситуации!

Ответы [ 6 ]

27 голосов
/ 15 апреля 2010

java.lang.Class не переопределяет метод equals из java.lang.Object, который реализован следующим образом:

public boolean equals(Object obj) {
    return (this == obj);
}

То есть a == b совпадает с a.equals(b) (кроме случаев, когда a равно нулю).

3 голосов
/ 15 апреля 2010

Для большинства приложений Java это правильно. Однако сравнение классов Java с использованием оператора == безопасно, только если оба класса загружены одним и тем же загрузчиком классов.

2 голосов
/ 15 апреля 2010

Я не уверен, будет ли это работать для вашей конкретной ситуации, но вы можете попробовать Class.isAssignableFrom (Class) .

KlassA.class.isAssignableFrom(klass)
1 голос
/ 15 апреля 2010

Это, вероятно, безопасно.

Если объект не переопределяет метод Equals, он выполнит сравнение между ссылками. И если две переменные указывают на один и тот же объект, их ссылки совпадают.

0 голосов
/ 24 ноября 2017

Как упоминалось в предыдущих ответах, для сравнения объектов типа Class (или объектов java.lang.Class) мы должны использовать оператор ==. Однако, это может быть немного запутанным, потому что всегда результат сравнения между объектами через оператор == не может привести к правильным результатам (мы обычно используем метод equal ()). Например, результатом этого выражения является ложь:

new String("book") == new String("book")//false

Причина в том, что

Виртуальная машина управляет уникальным объектом Class для каждого типа . Следовательно, вы можете использовать оператор == для сравнения java.lang.Class объекты . С Базовая Java для нетерпеливых - Страница 153

Таким образом:

new String("book").getClass() == new String("book").getClass()//true

или

Class.forName("java.lang.String") == Class.forName("java.lang.String")//true

результат в true.

0 голосов
/ 19 октября 2017

Я предпочитаю использовать == для сравнения между объектами класса и константами перечисления, потому что это приводит к ошибкам времени компиляции в случае несовместимых типов.

Например:

Class<?> cls1 = Void.class;
String cls2 = "java.lang.String";

if (cls1 == cls2) doSomething();        // Won't compile

if (cls1.equals(cls2)) doSomething();   // Will compile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...