Форум программистов, компьютерный форум CyberForum.ru

Проверить возможность приведения типа - Android

Восстановить пароль Регистрация
 
 
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 414
29.01.2016, 21:30     Проверить возможность приведения типа #1
Как проверить, можно ли привести к типу?
Например:
Java
1
ViewGroup vg = (ViewGroup) findViewById(R.id.MyView);
Может привести к ошибке из-за невозможности приведения.
Можно ли заранее это узнать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2016, 21:30     Проверить возможность приведения типа
Посмотрите здесь:

EditText теряет возможность ввода текста Android
Android Проверить текст в едите
Android Есть ли возможность скроллить все представление вместе с изображением?
Android Простая и бесплатная возможность рисования для приложения под android
Android Eclipse: есть ли возможность группировать проекты?
Android Проверить соединение с интернетом
Возможность редактирования текста с GridView Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
29.01.2016, 22:08     Проверить возможность приведения типа #2
Оператор instanceof
Паблито
не спать!
1881 / 1615 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
30.01.2016, 12:16     Проверить возможность приведения типа #3
имхо
если в своей же программе возникает необходимость заюзать instanceof - значит что-то в архитектуре программы что-то пошло не так
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
30.01.2016, 12:26     Проверить возможность приведения типа #4
Цитата Сообщение от Паблито Посмотреть сообщение
если в своей же программе возникает необходимость заюзать instanceof - значит что-то в архитектуре программы что-то пошло не так
А может, там динамическое создание компонентов. Очень даже полезный оператор.
Паблито
не спать!
1881 / 1615 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
30.01.2016, 12:31     Проверить возможность приведения типа #5
Я когда на оверфлоу случайно вижу в коде instanceof, сразу автоматически смотрю на автора сообщения, как правило это индусы.
И вообще я написал что это имхо.

Что такое динамическое создание? Он не знает какого типа этот объект в xml файле?

"Anytime you find yourself writing code of the form "if the object is of type T1, then do something, but if it's of type T2, then do something else," slap yourself.
(c) не мой
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 414
30.01.2016, 13:12  [ТС]     Проверить возможность приведения типа #6
Цитата Сообщение от Паблито Посмотреть сообщение
имхо
если в своей же программе возникает необходимость заюзать instanceof - значит что-то в архитектуре программы что-то пошло не так
Объясню. Требуется менять setEnabled() всех элементов контейнерного компонента.
Т.е. всё содержимое LinearLayout. Но в одном LinearLayout могут быть другие контейнеры типа LinearLayout, RadioGroup и пр.
Решил рекурсивно обходить содержимое, перед этим проверяя возможность приведения к типу ViewGroup для того, чтобы не нарваться на ошибку при попытке чтения getChildCount().
Может есть более простой способ поменять доступность группы элементов?
Я не нашел.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
30.01.2016, 13:13     Проверить возможность приведения типа #7
Паблито, Вы не правы. instanceof часто нужен, даже необходим. Вот Вам пример.
В поток consumer поступают сообщения на обработку. При остановке приложения надо остановить этот поток. Правильным решением будет сделать общий интерфейс для сообщения и для сигнала для завершения потока.

Java
1
2
3
4
5
6
7
8
while (true) {
   ISignal consumerMessage = sharedQueue.take();
   if (consumerMessage instanceof Message) {
      //
  } else if (consumerMessage instanceof ShutdownSignal) {
     break;
  }
}
Добавлено через 21 секунду
Slon747, instanceof
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
30.01.2016, 15:20     Проверить возможность приведения типа #8
Цитата Сообщение от Паблито Посмотреть сообщение
И вообще я написал что это имхо.
Вот вам и привели примеры. Всё, что пишете, не может быть объективным, а только лишь субъективным, поэтому "имхо" можно даже не добавлять.
Кстати, некоторые индусы вполне даже дело пишут, блоги ведут, в общем, сильные специалисты.
Не так давно на одной работе junior, который считает себя middle, рассказал мне, что instanceof - самая медленная и ненужная операция. Что даже просто сравнение классов как строк работает быстрее, а потому от instanceof надо везде избавляться. Я, на всякий случай, поискал на SO сравнения по скорости с 4 другими реализациями. Оказалось, что instanceof выигрывает почти во всех случаях. Так что зря её недооценивают.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
30.01.2016, 16:24     Проверить возможность приведения типа #9
CoolMind, всё верно. instanceof отличная вещь. Но опять же, если её применять для контроля при неправильном наследовании, когда у вас "рыба" наследуется от "птицы", то это плохой вариант. Но тут дело не instanceof, а в плохой архитектуре
Паблито
не спать!
1881 / 1615 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
30.01.2016, 17:22     Проверить возможность приведения типа #10
Цитата Сообщение от Паблито Посмотреть сообщение
если в своей же программе возникает необходимость заюзать instanceof - значит что-то в архитектуре программы что-то пошло не так
Цитата Сообщение от YuraAAA Посмотреть сообщение
Но тут дело не instanceof, а в плохой архитектуре

Цитата Сообщение от YuraAAA Посмотреть сообщение
В поток consumer поступают сообщения на обработку. При остановке приложения надо остановить этот поток. Правильным решением будет сделать общий интерфейс для сообщения и для сигнала для завершения потока.
почему не сделать перечислением тип сообщения?
определить в том же интерфейсе

Цитата Сообщение от Slon747 Посмотреть сообщение
Объясню. Требуется менять setEnabled() всех элементов контейнерного компонента.
это можно сделать кучей способов, хоть через слушатели
каждый компонент может менять свое состояние в зависимости от какого-то события (например изменилось значение поля)

поднимите руку кто согласен с тем что задача, которую описал ТС наилучшим образом решается с применением insnaceof ?

Цитата Сообщение от CoolMind Посмотреть сообщение
Не так давно на одной работе junior, который считает себя middle, рассказал мне, что instanceof - самая медленная и ненужная операция. Что даже просто сравнение классов как строк работает быстрее, а потому от instanceof надо везде избавляться.
абсолютно согласен
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
30.01.2016, 17:26     Проверить возможность приведения типа #11
Цитата Сообщение от Паблито Посмотреть сообщение
почему не сделать перечислением тип сообщения?
определить в том же интерфейсе
поясните. Вот пример,

Java
1
2
3
4
5
6
7
while (true) {
* *ISignal consumerMessage = sharedQueue.take();
* *if (consumerMessage instanceof Message) {
* * * DaoAccessor.save((Message) consumerMessage);
* } else if (consumerMessage instanceof ShutdownSignal) {
* * *break;
* }
Паблито
не спать!
1881 / 1615 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
30.01.2016, 17:31     Проверить возможность приведения типа #12
Java
1
2
3
4
5
6
7
8
9
10
11
12
switch(consumerMessage.getType()) {
   case ISignal.Message:
   //
   break;
   case ISignal.ShutdownSignal:
   //
   break;
}
 
interface ISignal {
 enum {Message, ShutdownSignal}
}
писал не в ide, но надеюсь мысль понятна
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
30.01.2016, 18:03     Проверить возможность приведения типа #13
Цитата Сообщение от Паблито Посмотреть сообщение
поднимите руку кто согласен с тем что задача, которую описал ТС наилучшим образом решается с применением insnaceof ?
Без разницы, лучшим или не лучшим, но решается и решается хорошо. Я так же решал.
Паблито
не спать!
1881 / 1615 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
30.01.2016, 18:54     Проверить возможность приведения типа #14
Цитата Сообщение от CoolMind Посмотреть сообщение
Без разницы, лучшим или не лучшим, но решается и решается хорошо. Я так же решал.
Цитата Сообщение от CoolMind Посмотреть сообщение
Всё, что пишете, не может быть объективным, а только лишь субъективным
Я уже много раз на этом форуме выступал за какую-то идею или подход. Потом проходило время и мое мнение иногда менялось. И мне не стыдно, я так учусь.

Добавлено через 44 минуты

Не по теме:

и я не говорил что instanceof медленнее, речь шла об архитектуре (косвенно это же подтвердил YuraAAA)

очень давно я читал какую-то тему в разделе джавы, где обсуждали instanceof и проверял скорость для себя, разницы не заметил и забил

Dantes2104
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
30.01.2016, 19:11     Проверить возможность приведения типа #15
Можно сделать проверку так
Java
1
2
3
4
5
6
7
8
ViewGroup vg = null;
try{
vg = (ViewGroup) findViewById(R.id.MyView);
//Действие если тип приводимый
}
catch{
//Действие если привести тип не удалось.
}
Добавлено через 12 минут
Ой. Последние строчки так выглядят.
Java
1
2
3
 catch (Exception e){
//Действие если привести тип не удалось.
}
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
30.01.2016, 21:07     Проверить возможность приведения типа #16
Dantes2104, а это вообще плохой вариант. Давайте тогда и на null не проверять, а оборачивать в Try-catch NullPointerException
Lumber
81 / 81 / 30
Регистрация: 02.12.2015
Сообщений: 210
30.01.2016, 21:35     Проверить возможность приведения типа #17
Ну вот мне надо повесить OnClickListener на все кнопки (и только на кнопки) во фрагменте. Я перебираю все элементы и проверяю не кнопка ли это (instanceof Button). А как надо?
Dantes2104
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
30.01.2016, 21:47     Проверить возможность приведения типа #18
Цитата Сообщение от YuraAAA Посмотреть сообщение
Dantes2104, а это вообще плохой вариант. Давайте тогда и на null не проверять, а оборачивать в Try-catch NullPointerException
Ну если он использует переменную, то пусть тогда и на null проверит, я думаю if знает каждый программист. Это просто общий вариант. Может быть вы сможете разъяснить мне в чём плох этот вариант?
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
30.01.2016, 21:53     Проверить возможность приведения типа #19
Lumber, а может так?
Java
1
2
3
4
5
6
switch (v.getId()) {
   case R.id.btn_1:
       Button.class.cast(v).setText("Button 1 clicked");
       break;
    ////
}
Добавлено через 3 минуты
Цитата Сообщение от Dantes2104 Посмотреть сообщение
Может быть вы сможете разъяснить мне в чём плох этот вариант?
Да, конечно же. На самом деле, с точки зрения производительности между instanceof и try-catch разницы не будет, или же она будет несущественной. Но читаемость кода снижается, теряется его прозрачность. В общем случае, рекомендуется использовать instanceof, это общепринятая практика.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2016, 21:55     Проверить возможность приведения типа
Еще ссылки по теме:

Android Webview, добавить возможность покупки пакетов
Как получить возможность обращатся к глобальным переменным? Android
Возможность использования Java 8 в Android Android
Есть ли возможность быстро и легко настроить B4A? Или сразу перейти на Android Studio? Basic4Android
Android Возможность смены темы/стиля приложения в рантайме

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Lumber
81 / 81 / 30
Регистрация: 02.12.2015
Сообщений: 210
30.01.2016, 21:55     Проверить возможность приведения типа #20
Цитата Сообщение от YuraAAA Посмотреть сообщение
а может так
Так это уже обработка нажатия.
А мне надо вызвать setOnClickListener() для всех кнопок.

Java
1
2
3
4
5
6
List<View> touchables = layout.getTouchables();
for (View view : touchables) {
    if (view instanceof Button) {
        view.setOnClickListener(mKeysListener);
    }
}
Yandex
Объявления
30.01.2016, 21:55     Проверить возможность приведения типа
Ответ Создать тему
Опции темы

Текущее время: 19:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru