Дергаем класс через интерфейс (instanceof vs static int)

Ответить
Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Дергаем класс через интерфейс (instanceof vs static int)

Сообщение Nyashka » 12 июл 2013, 12:27

Прошу совета по поводу использования instanceof. Говорят что она работает медленно, потому что использует проход по древу классов до всех потомков, и это вроде не очень хорошо. Поэтому хотелось бы знать что из этого лучше по производительности:
1)

Код: Выделить всё

interface A{};
class B implements A{};
class C implements A{};
ArrayList <A> listOfA =new ArrayList<A>();
listOfA.add(new B());
listOfA.add(new C());
for (int i=0; i<listOfA.size(); i++;){
	if (listOfA.get(i) instanceof B){
		//работаем с B
	} else if (listOfA.get(i) instanceof C){
		//работаем с C
	}
}
2)

Код: Выделить всё

interface Const {
	int ClassBNo=10;
	int ClassCNo=11;
	public int getClassNo();
};
interface A{};
class B implements A, Const{ public int getClassNo(){ return Const.ClassBNo};};
class C implements A, Const{public int getClassNo(){ return Const.ClassCNo};};
ArrayList <A> listOfA =new ArrayList<A>();
listOfA.add(new B());
listOfA.add(new C());
for (int i=0; i<listOfA.size(); i++;){
	int classNo=listOfA.get(i).getClassNo();
	if (classNo==Const.ClassBNo){
		//работаем с B
	}else if(classNo==Const.ClassCNo){
		//работаем с C
	}
}
Либо может быть размещение не имеющих одинаковой абстрактной базы в одном списке делается как то по другому? Подскажите :)

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Дергаем класс через интерфейс (instanceof vs static int)

Сообщение anber » 12 июл 2013, 12:44

Nyashka писал(а):хотелось бы знать что из этого лучше по производительности
На этот вопрос можно дать 2 ответа: простой и сложный.
Простой: возьми и практически выясни какой из методов сколько времени выполняется.

Чтобы дать сложный ответ нужны некоторые уточнения:
1) знакомо ли тебе понятие полиморфизм?
2) знаком ли стандартный метод любого объекта getClass() ?
3) что ты собираешься делать со списком такое что нужно узнавать тип объекта и в тоже время так критична разница в производительности?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: Дергаем класс через интерфейс (instanceof vs static int)

Сообщение Nyashka » 12 июл 2013, 13:04

anber писал(а): 1) знакомо ли тебе понятие полиморфизм?
2) знаком ли стандартный метод любого объекта getClass() ?
3) что ты собираешься делать со списком такое что нужно узнавать тип объекта и в тоже время так критична разница в производительности?
1) в принципе знакомо, на нем основывается работа нескольких классов описывающих свойства объектов
2) нет, я им не пользуюсь =(
3) В данном случае: Планировщик держит при себе движки различной направленности, сам о них ни чего не знает и знать не должен. Но общий интерфейс должен быть, что бы дать им поработать, или напротив, отнять эту возможность, вывод об оном делает на основе весов доступных ему через вышеописанные интерфейсы. Производительность критична как в случае любых других рантайм приложений, за 33 мс надо обработать прикосновения основываясь на памяти жестов, проанализировать осьвращения устройства, просчитать физику процессов происходящих с объектами, просчитать логику процессов, нарисовать кадр на вывод, подогнать музычку... Я думаю очень критично

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: Дергаем класс через интерфейс (instanceof vs static int)

Сообщение Nyashka » 12 июл 2013, 13:14

Кстати говоря, верно вы подметили, что тут возможна работа исключительно через интерфейсы, однако схожий механизм должен работать и в отношении свойств объектов, целостность которых (свойств) нарушена в следствии того что система сама является распределенной (о структуре объектов с которыми будет работать на момент запуска ни чего не известно, и даже не известно кто с ними будет работать), а следовательно, нет заранее прописанного объекта к свойствам которого мы можем обратиться. Отсюда необходимость хранить только интерфейсы объектов, а в последствии движки, которым известно как работать с конкретными данными, через эти самые интерфейсы разименуют необходимый класс, после чего начнут работу с ним.

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: Дергаем класс через интерфейс (instanceof vs static int)

Сообщение Nyashka » 12 июл 2013, 15:53

anber писал(а): 2) знаком ли стандартный метод любого объекта getClass() ?
Спасибо за наводку, буду изучать рефлексию что бы лучше организовать динамическую архитектуру

Ответить