Поиск по этому блогу

понедельник, 19 января 2015 г.

Java оператор instanceof

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

Рассмотрим пример с GWT. Допустим мы в панель класса SimplePanel добавляем в зависимости от условия либо объект созданного нами класса ListDropDownWidget, либо объект класса Anchor. Оба этих объекта являются виджетами.

SimplePanel panel = new SimplePanel();
if (question.getQuestionType() == QuestionType.CHECKBOXES)
  ListDropdownWidget dropdown = new ListDropdownWidget();
  panel.setWidget(dropdown);
} else {
  String title = "Title";
  Anchor a = new Anchor(title);
  panel.add(a);
}

Теперь нам необходимо перевести содержимое этой панели в состояние readOnly. Для этого нужно получить виджет, который содержится в панели. А в панели может содержаться 2 типа виджетов, как было сказано выше. Поэтому после того, как мы получаем виджет, который содержался в панели, необходимо определить к какому классу он относится. Вот здесь и используется опреатор instanceof. Если содержащийся в панели виджет является объектом класса ListDropdownWidget, то приводим полученный виджет к этому классу и вызываем соответствующий метод. По такой же логике действуем, если виджет является объектом класса Anchor.

public void setReadOnly(boolean readOnly) {
  Widget widget = panel.getWidget(); 
  if (null != widget) { 
    if (widget instanceof ListDropdownWidget) {
      ListDropdownWidget dropdown = ListDropdownWidget widget;
      dropdown.setReadonly(readOnly); 
    } else if (widget instanceof Anchor) {
      Anchor a = (Anchor) widget;
      a.setEnabled(!readOnly);
    }
  }
}

Комментариев нет:

Отправить комментарий