Умный способ проверить супер-класс - PullRequest
7 голосов
/ 02 апреля 2011
public  boolean isUserControled(){      
        return action.getClass().getSuperclass().toString().equals("class logic.UserBehaviour");
}

Я думаю, этот фрагмент кода довольно понятен.Есть ли более умный способ сделать это?

Спасибо

Ответы [ 3 ]

11 голосов
/ 02 апреля 2011

(action instanceof logic.UserBehaviour) вернет true, если действие - это объект типа, который расширяет UserBehavior.

Выдержка из http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

Оператор сравнения типов InstanceOf

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

Следующая программа, InstanceofDemo, определяет родительский класс (с именем Parent), простой интерфейс MyInterface) и дочерний класс (названный Ребенок), который наследует от родителя и реализует интерфейс.

class InstanceofDemo {
  public static void main(String[] args) {

    Parent obj1 = new Parent();
    Parent obj2 = new Child();

    System.out.println("obj1 instanceof Parent: " + (obj1 instanceof Parent));
    System.out.println("obj1 instanceof Child: " + (obj1 instanceof Child));
    System.out.println("obj1 instanceof MyInterface: " + (obj1 instanceof MyInterface));
    System.out.println("obj2 instanceof Parent: " + (obj2 instanceof Parent));
    System.out.println("obj2 instanceof Child: " + (obj2 instanceof Child));
    System.out.println("obj2 instanceof MyInterface: " + (obj2 instanceof MyInterface));
  }
}

class Parent{}
class Child extends Parent implements MyInterface{}
interface MyInterface{} 

Выход:

obj1 instanceof Parent: true
obj1 instanceof Child: false
obj1 instanceof MyInterface: false
obj2 instanceof Parent: true
obj2 instanceof Child: true
obj2 instanceof MyInterface: true

При использовании оператора instanceof помните, что null не является экземпляром чего-либо.

9 голосов
/ 02 апреля 2011

Если вы специально не хотите проверять только самый первый суперкласс, было бы лучше использовать:

return (action instanceof logic.UserBehavior);

Ваш метод будет лучше с этим:

action.getClass().getSuperClass().name().equals("logic.UserBehavior");

Звонок на toString() не самая лучшая идея.

Или еще лучше, как написано Ульрик :

action.getClass().getSuperClass() == logic.UserBehavior.class
5 голосов
/ 02 апреля 2011

Если вы хотите проверить только самый первый суперкласс:

return action.getClass().getSuperclass() == logic.UserBehavior.class;

В противном случае:

return (action instanceof logic.UserBehaviour);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...