Страница 1 из 1

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

Добавлено: 12 июл 2013, 12:27
Nyashka
Прошу совета по поводу использования 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
	}
}
Либо может быть размещение не имеющих одинаковой абстрактной базы в одном списке делается как то по другому? Подскажите :)

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

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

Чтобы дать сложный ответ нужны некоторые уточнения:
1) знакомо ли тебе понятие полиморфизм?
2) знаком ли стандартный метод любого объекта getClass() ?
3) что ты собираешься делать со списком такое что нужно узнавать тип объекта и в тоже время так критична разница в производительности?

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

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

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

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

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

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