powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Какие альтернативы есть у instanceOf
60 сообщений из 60, показаны все 3 страниц
Какие альтернативы есть у instanceOf
    #38048730
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть абстрактный класс A
у него есть конкретные потомки A1 A2 A3
у клиента есть массив ссылок на A (соответственно там могут быть A1 A2 A3)
Я хочу произвести действия только над A1(например)
Просто слышал, что instanceOf - очень плохо использовать
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38048789
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
instanceof зачастую это затычка, на месте которой лучше использовать полиморфизм (на то много причин, если очень нужно, можно попробовать перечислить).

Решается созданием метода в A, и соответствующей его реализацией-переопределением в A1.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38048811
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, redwhite90!

> Есть абстрактный класс A
> у него есть конкретные потомки A1 A2 A3
> у клиента есть массив ссылок на A (соответственно там могут быть A1 A2 A3)
> Я хочу произвести действия только над A1(например)

Примерно так :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class A {
....
public void doAction() {
}
....
}


class A1 {
....
@Override
public void doAction() {
  realDoAction();
}
....


--
Алексей
JID: alxt@ya.ru


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38048812
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

obj.getClass()==A1.class
A1.class.isInstance(obj)
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38048826
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Я хочу произвести действия только над A1(например)
по архитектуре)
http://www.sql.ru/forum/actualthread.aspx?tid=930725&pg=-1&hl=%f2%e8%ef%20%ea%eb%e0%f1%f1%e0
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049471
pasha701
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049691
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GKS_Samara,
Не понял вашей идеи
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049692
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
У меня есть метод включить(абстрактный).
а я хочу чтобы у меня была возможность включить только приборы класса A1
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049699
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Blazkowicz,
У меня есть метод включить(абстрактный).
а я хочу чтобы у меня была возможность включить только приборы класса A1
На абстрактном примере тут можно долго спорить. Раскрывайте конкретику.
Если у вас есть метод "включения". И "включать" можно только A1 из списка экземпляров А. То логичный вопрос, откуда вообще взялся список всего насвете, когда нужны только А1.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049701
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
не понял
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049705
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

есть класс прибор(абстрактный)
приборы делятся по категориям(наследуются от прибора).(световые, тепловые....)

ну вот и есть желание одним движением включить все световые или тепловые, то есть нужна проверка на принадлежность классу.

я реализовал через
Код: java
1.
.getClass().getName()
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049706
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
немножко команду напоминает внешне....но думаю слишком уж тут ее использовать
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049711
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90есть класс прибор(абстрактный)
приборы делятся по категориям(наследуются от прибора).(световые, тепловые....)

Где есть?

redwhite90ну вот и есть желание одним движением включить все световые или тепловые, то есть нужна проверка на принадлежность классу.

Не обязательно. Откуда берутся остальные приборы?

redwhite90.getClass().getName()

Без конкретики разговор ни о чем. Откуда приборы. Что такое "включить". Никто кроме вас не знает.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049712
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90немножко команду напоминает внешне....но думаю слишком уж тут ее использовать
Команда нужна чтобы отделить отправителя и получателя и сделать их максимально независимыми. У вас такая задача?
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049717
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Petro123,
не понял
там конкретный пример из жизни - выделить Особый класс из списка. Так ведь?

Изначально, нет смысла пихать ВСЕ в ОДИН список
"массив ссылок на A (соответственно там могут быть A1 A2 A3)"
чтобы потом ВЫДЕЛЯТЬ и ПРОВЕРЯТЬ кого то по его ФИО.

Так понятно?
- Сделай на клиенте 3 списка, чем использовать RTTI. Это ответ в лоб.
Так понятно?

Тебе сказали - нужна конкретика. Иначе = говнокод.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049718
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Все приборы(световые, тепловые....) наследуются от абстрактного прибора
все приборы хранятся в массиве типа прибор(абстрактный)
Как сделать так, чтобы пройдясь по массиву можно было запустить только один из предков
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049720
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
Ну тогда надо делать три цикла или какой то композитный итератор, чтобы прогуляться по массиву, ради одного использования наверное оно того не стоит
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049729
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Petro123,
Ну тогда надо делать три цикла или какой то композитный итератор, чтобы прогуляться по массиву, ради одного использования наверное оно того не стоит
Ну, если оно правда одно. То, да. Сделать и забыть. Если проект ещё годы развивать. То стоит подумать.
И конечно же гетерогенная коллекция всегда плохо.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38049916
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, redwhite90!

> есть класс прибор(абстрактный)
> приборы делятся по категориям(наследуются от прибора).(световые,
> тепловые....)

Код: sql
1.
2.
3.
4.
5.
class Device {
.....
public void abstract turnOn();
public boolean abstract isLightDevice();
public boolean abstract isThermalDevice();



> ну вот и есть желание одним движением включить все световые или
> тепловые, то есть нужна проверка на принадлежность классу.

Код: sql
1.
2.
3.
for (Device device : deviceList)
  if (device.isLightDevice())
    device.turnOn();



> .getClass().getName()

Очень небезопасно к изменениям.

--
Алексей
JID: alxt@ya.ru


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050046
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90Есть абстрактный класс A
у него есть конкретные потомки A1 A2 A3
у клиента есть массив ссылок на A (соответственно там могут быть A1 A2 A3)
Я хочу произвести действия только над A1(например)
Просто слышал, что instanceOf - очень плохо использовать
Тут явно паттерн visitor, как и указал pasha701. Примерно такой клиентский код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void doSomething(A value) {
	// nothing
}

// определяем перегруженный метод только для A1 и наследников
void doSomething(A1 value) {
	// необходимые действия
	...
}

// ну и работа с массивом
for(A value:collectionOfA) {
	doSomething(value);
}
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050054
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraredwhite90Есть абстрактный класс A
у него есть конкретные потомки A1 A2 A3
у клиента есть массив ссылок на A (соответственно там могут быть A1 A2 A3)
Я хочу произвести действия только над A1(например)
Просто слышал, что instanceOf - очень плохо использовать
Тут явно паттерн visitor, как и указал pasha701. Примерно такой клиентский код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void doSomething(A value) {
	// nothing
}

// определяем перегруженный метод только для A1 и наследников
void doSomething(A1 value) {
	// необходимые действия
	...
}

// ну и работа с массивом
for(A value:collectionOfA) {
	doSomething(value);
}



Работать не будет, doSomething(A value) будет всегда вызываться. Вот этого метода doSomething(A value) и не должно быть.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050059
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,
12519420
Может и не стоит. Тебе дали все возможные варианты начиная от костыля.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050171
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczinstanceof зачастую это затычка, на месте которой лучше использовать полиморфизм (на то много причин, если очень нужно, можно попробовать перечислить).очень нужно, взял блокнот
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050205
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0FDРаботать не будет, doSomething(A value) будет всегда вызываться. Вот этого метода doSomething(A value) и не должно быть.

Согласен, написал чересчур коротко и как следствие неточно. Вот рабочий пример
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
// тут желательно определить интерфейсы, пропущено для краткости
class A {
	void accept(Visitor visitor) {
		visitor.doSomething(this);
	}
}
class Visitor{
	void doSomething(A value) {
		//nothing
	}
	void doSomething(A1 value) {
		System.out.println("A1");
	}
}
class A1 extends A{
	void accept(Visitor visitor) {
		visitor.doSomething(this);
	}
}
class A2 extends A{}
public class TestCase {
	public static void main(String[] args) {
		Visitor visitor = new Visitor();
		A[] values = {
			new A1(),
			new A2()
		};
		for(A value:values) {
			value.accept(visitor);
		}
	}
}


Весь фокус в перегрузке методов в Visitor и переопределении accept в нужных классах
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050248
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
Визитор не убирает необходимость проверки особого класса или объекта. Он просто убирает все проверки в лапше-коде внутрь одного класса.
Т.е решений всего 2. Либо особые флажки в модели либо RTTI
IMHO
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050251
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grasoff.netочень нужно, взял блокнот
Негодяй. :)
Конечно иногда мы не может сделать рефакторинг, так как не владеем класами. Например это коллекции или обертки примитивов.
Поэтому далее предполагаем что мы проверяем собственные классы.

В растущем проекте. (А мы всегда предполагаем что проект растет)
Код вида
Код: java
1.
2.
3.
if(o instanceof Clazz){
 ...
}

часто превращается в
Код: java
1.
2.
3.
4.
5.
6.
if(o instanceof Clazz){
 ...
}else if(o instanceof AnotherClazz)
 ...
{
}



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


Второе, это то что рафакторить-двигать методы по иерархи вверх-вниз достаточно просто. А то время как зарефакторить лесенку if...else труднее, особенно если кто-то туда домешал дополнительных условий. Код на полиморфизме проще модифицировать.

Ну, и третье, хотя, возможно, и не последнее это читаемость . С полиморфизмом в конкретном классе у нас есть небольшой конкретный метод. В случае лесенки instanceof приходится охватывать взглядом сразу несколько вариантов и искать нужный.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050273
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra0FDРаботать не будет, doSomething(A value) будет всегда вызываться. Вот этого метода doSomething(A value) и не должно быть.

Согласен, написал чересчур коротко и как следствие неточно. Вот рабочий пример
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
// тут желательно определить интерфейсы, пропущено для краткости
class A {
	void accept(Visitor visitor) {
		visitor.doSomething(this);
	}
}
class Visitor{
	void doSomething(A value) {
		//nothing
	}
	void doSomething(A1 value) {
		System.out.println("A1");
	}
}
class A1 extends A{
	void accept(Visitor visitor) {
		visitor.doSomething(this);
	}
}
class A2 extends A{}
public class TestCase {
	public static void main(String[] args) {
		Visitor visitor = new Visitor();
		A[] values = {
			new A1(),
			new A2()
		};
		for(A value:values) {
			value.accept(visitor);
		}
	}
}


Весь фокус в перегрузке методов в Visitor и переопределении accept в нужных классах

Повторюсь, РАБОТАТЬ НЕ БУДЕТ. ПОТОМУ ЧТО
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050278
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class A {
	void accept(Visitor visitor) {
		visitor.doSomething(this);   ---> Visitor.doSomething(A value) { --->>//nothing
		//nothing
	}
}
class Visitor{
	void doSomething(A value) {
		//nothing
	} 
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050290
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
и какие тут бенефиты от визитора? в сравнении с обычным методом и его переопределением?
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050302
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Открываем хотя бы википедию и смотрим что даёт Visitor.
Его задача реализовать РАЗНЫЕ операции над разным элементами. Причем основное достоинство в том что много разных операций разделяются на разные визиторы с общим интерфейсом.
В данной же задаче есть единственный тип и, пока, единственная операция. Для каждого типа свой Visitor будет. 8)
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050328
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczivanra,
и какие тут бенефиты от визитора? в сравнении с обычным методом и его переопределением?
Ну, фактически, визитор и есть завуалированное переопределение, только в самом классе метод переопределяется шаблоном, а все полезные действия выносятся в перегруженный метод визитора. В примере всё работает благодаря методу, переписанному под копирку
Код: java
1.
2.
3.
4.
5.
class A1 extends A{
	void accept(Visitor visitor) {
		visitor.doSomething(this);
	}
}


Фактически, это означает, что в рантайме класс A1 вызовет метод с сигнатурой visitor.doSomething(A1), вот и весь фокус.

0FD : пример рабочий, скопируйте и запустите
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050333
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не тратьте время на споры, еще страница и Petro123 все сведет к базе данных))
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050418
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerНе тратьте время на споры, еще страница и Petro123 все сведет к базе данных))
Угу))))
Или к вопросу- почему в java не любят RTTI ))
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050435
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050452
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz +100

Но добавлю что даункастинги если они будут требуют обработки exception
что само по себе дорогостоящая штука. instanceof надо полагать работает
экономно т.к. генерирует одну инструкцию jvm "instanceof". Тоесть тут
как-бы надо подумать а на сколько "дорого" нам обработать неизвестный
Object который попал на вход нашего интерфейса.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050561
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz http://www.javapractices.com/topic/TopicAction.do?Id=31

Думаю, по ссылке немного о другом речь. Там говорят, что логику метода нужно определять в самом методе, а не где-то в другом месте, выясняя сначала с помощью instanceof какую именно логику мы должны применить.
Думаю, автору вполне подойдёт это

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
public class XDevice
{
    public void doSomething()
    {
        System.out.println('Hello from XDevice');
    }
}

public class GoodDevice extends XDevice
{
    private static Boolean hold;
    
    public static void setHold( Boolean val ) 
    {
        hold = val;
    }
    
    @Override
    public void doSomething()
    {
        if ( !GoodDevice.hold )
        {
            System.out.println('Hello from GoodDevice');
        }
    }
}

public class BadDevice extends XDevice
{
    private static Boolean hold;
    
    public static void setHold( Boolean val ) 
    {
        hold = val;
    }
    
    @Override
    public void doSomething()
    {
        if ( !GoodDevice.hold )
        {
            System.out.println('Hello from BadDevice');
        }
    }
}


...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050602
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miha_S7Думаю, по ссылке немного о другом речь.

Именно об этом.

Miha_S7Там говорят, что логику метода нужно определять в самом методе, а не где-то в другом месте, выясняя сначала с помощью instanceof какую именно логику мы должны применить.

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

Miha_S7Думаю, автору вполне подойдёт это

Это именно то что автору предложили ещё на первой странице.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
    private static Boolean hold;
    
    public static void setHold( Boolean val ) 
    {
        hold = val;
    }
...    
    private static Boolean hold;
    
    public static void setHold( Boolean val ) 
    {
        hold = val;
    }   
...


У меня в глазах двоится.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050625
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант instanceof можно использовать с маркерным интерфейсом. Возможно этот вариант будет некотором компромисом между проверкой на конкретный тип и добавлением метода во всю иерархию. Да и интерфейс не обязательно делать маркерным. Можно в нем объявить метод "включить".

Код: java
1.
2.
3.
4.
5.
for (Device device : deviceList){
  if (device instanceof Activatable){
    ((Activatable)) device.activate();
  }
}
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050685
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подумал ещё немного. Всё же я бы отказался от гетерогенного списка и унес логику фильтрации в саму коллецию.

Код: java
1.
2.
3.
4.
Collection<Activatable> activatables = devices.byType(Activatable.class);
for(Activatable activatable : activatables){
     activatable.activate();
}


Тогда у нас всегда будет запас оптимизировать коллекцию, если перебор станет слишком дорогим.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050696
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если свести instanceof к работе с примитивами (или энумами)? К примеру,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public enum DeviceType {A1, A2, A3}

class A1 {
    public DeviceType getType() {
        return DeviceType.A1;
    }
}

class A2 {
    public DeviceType getType() {
        return DeviceType.A2;
    }
}

class Controller {
    ...
    for (A device: devices)
        if (device.getType() == DeviceType.A1) {...}
    ...
}


То есть просто реализовываем аналогичную проверку на принадлежность потомка к нужному типу. Не так универсально, но чуть менее затратно. Хотя, в принципе, вариант с расширением абстрактного класса-контроллера или наследование контроллеров для однотипных девайсов от одного интерфейса выглядит заманчивее.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050777
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczКак вариант instanceof можно использовать с маркерным интерфейсом. Возможно этот вариант будет некотором компромисом между проверкой на конкретный тип и добавлением метода во всю иерархию. Да и интерфейс не обязательно делать маркерным. Можно в нем объявить метод "включить".

Код: java
1.
2.
3.
4.
5.
for (Device device : deviceList){
  if (device instanceof Activatable){
    ((Activatable)) device.activate();
  }
}


Ну, к примеру
15:42 - мы хотим включить все жалюзи, а остальные девайсы не трогать. Если применять маркерный интерфейс, то мы должны вписать этот интерфейс в код класса. Ок, вписали, сделали, включили.
18:00 - хотим включить все световые приборы. Что делать? Для классов "световых" девайсов тоже интерфейс прописывать? Тогда они и в 15:42 сработают. Не? Или я где-то туплю?
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050826
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miha_S7,
Причем тут тип класса в сабже и время?
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050870
Miha_S7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Miha_S7,
Причем тут тип класса в сабже и время?

Ну это же, чтобы проиллюстрировать, что классы мы определяем на этапе кодинга. А активировать/деактивировать функциональность метода какого-то класса нам может быть нужно в рантайме.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050889
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miha_S7Petro123Miha_S7,
Причем тут тип класса в сабже и время?

Ну это же, чтобы проиллюстрировать, что классы мы определяем на этапе кодинга. А активировать/деактивировать функциональность метода какого-то класса нам может быть нужно в рантайме.
Нет.
Время в минутах и RTTI т.е. сабж, совершенно разные вещи.
Просто вместо маркера от программиста уже есть маркер от компиляторы - пользуйся и не будь конфигурастом. ШУТКА.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050892
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня похожие вопросы. Буду благодарен, если подскажете что-нить красивое.
Существует небольшое подобие анемичной модели. Объекты не содержат логики, только состояние. Различные действия с объектами выполняют соответствующие сервисы. В моем примере есть автомобиль и самолет, и соответствующие им сервисы. Так же там есть менеджер сервисов, который должен работать так: клиент( в смысле потребитель услуг моих сервисов) знает о классе объекта, с которым будет работать. Он хочет получить сервис, связанный с этим классом. Для этого он обращается к менеджеру сервисов, и передает ему класс объекта. А менеджер возвращает связанный с ним сервис. Не могу придумать, как избежать в менеджере перебора классов чтобы найти и отдать нужный сервис.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
public class Test {

    public static void main(String[] args) {
     
     IEntity  car = new ControllerManager().getController(Car.class).get();
     
    }   
    
   
}
interface IEntity{
    
}

class Car implements IEntity{
     
}

class Plane implements IEntity{
     
}

interface IEntityController{
    IEntity get();
}

class PlaneController implements IEntityController{

    @Override
    public Plane get() {
        return new Plane();
    }
    
}

class CarController implements IEntityController{

    @Override
    public Car get() {
        return new Car();
        
    }
    
}

class ControllerManager{
     IEntityController getController(Class<?> clazz){
        //тут хочу вернуть сервис для конкретной энтити
       //как-нибудь красиво 
        return null;
    }
  
     
}
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050909
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapecker,
Ты просто перевернул с ног на голову.
Клиент не работает с объектами. Он вызывает Сервис - как хранимку- сделай то- то.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050919
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
допустим перевернул, как все-таки быть для этого перевернутого случая?
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38050949
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть лексическая связь между entitiy и ее интерфейсом контроля то
можно привязаться к именам. Plane -> PlaceController, Car->CarController.
Ну и дальше через загрузчик классов.
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38051020
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и без имен: намертво привязать класс контроллера внутри класса сущности. И через вызов имплементированного метода сущности-наследника вызывать контроллер. Правда, эти способы не очень хорошо пахнут ...
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38051033
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
Клиент не работает с объектами. Он вызывает Сервис - как хранимку- сделай то- то.
Ну пусть сделай то-то. Так вот сервис, который может сделать то-то, должен знать с чем это делать и с помощью чего. С чем у него есть, а с помощью чего - это мои сервисы самолетов и машин, и их надо как-то получить, как получают нормальные люди?
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38051122
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНегодяй.не
я просто ссылку отправить хочу потом кое-кому, чтобы читали штоль
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38051264
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Есть абстрактный класс A
у него есть конкретные потомки A1 A2 A3
у клиента есть массив ссылок на A (соответственно там могут быть A1 A2 A3)
Я хочу произвести действия только над A1(например)
Просто слышал, что instanceOf - очень плохо использовать
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
abstract class A { }
class A1 extends A { }
class A2 extends A { }
class A3 extends A { }
...
List<A> lst = new ArrayList<A>();
lst.add(new A1()); lst.add(new A2()); lst.add(new A3());
lst.add(new A1()); lst.add(new A2()); lst.add(new A3());
lst.add(new A1()); lst.add(new A2()); lst.add(new A3());
for (A a: lst) {
    try {                                                                  
        A1 a1 = (A1)a;
        System.out.println(a1.getClass().getName());
    } catch (ClassCastException e) {                                       
        ...
    }                                                                       
    ...
}
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38051273
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javapeckerНе могу придумать, как избежать в менеджере перебора классов чтобы найти и отдать нужный сервис.
есть 2 аспекта.
1. Менеджер, это в некоторм роде API. Т.е. нижний слой программирования. Поэтому - "красиво", там неприменимо. Т.е. вполне нормально делать цикл за несколько-там миллисекунд.
OFF
2. Про красивость самого сервисного слоя мы говорили с тобой в августе.
Это тут offtop и лично, понимаю этот слой - так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void processTrade(TradeData trade)                  throws Exception 
{
   try 
   {
      // БЛ или проверки всякие
      TraderData trader =      service.getTrader(trade.getTraderID());
      validateTrader(trade, trader);

      service.insertTrade(trade); //тут первый кэш будет сброшен и синхронизирован.
      // последующая обработка POST
      performPost(trade, trader);
   } 
   catch (Exception up) 
   {
      ctx.setRollbackOnly();
      throw up;
   }
}

...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38051301
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miha_S715:42 - мы хотим включить все жалюзи, а остальные девайсы не трогать. Если применять маркерный интерфейс, то мы должны вписать этот интерфейс в код класса. Ок, вписали, сделали, включили.
18:00 - хотим включить все световые приборы. Что делать? Для классов "световых" девайсов тоже интерфейс прописывать? Тогда они и в 15:42 сработают. Не? Или я где-то туплю?
Для каждого действия свой интерфейс, конечно же. Вижу мой подход как раз в вашу задачу вписывается.

Код: java
1.
2.
3.
4.
Collection<Lighting> lightings = devices.byType(Lighting.class);
for(Lighting lighting : lightings){
     lighting.light();
}
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38145449
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Blazkowicz]Miha_S7
Код: java
1.
2.
3.
4.
Collection<Lighting> lightings = devices.byType(Lighting.class);
for(Lighting lighting : lightings){
     lighting.light();
}



что за метод byType?
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38145678
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

Идите на темную сторону явы, у нас печеньки ! (с)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public final class A1 extends A {
	public static boolean commonState = false;	//false - off, true - on

}

public static void main(String[] args) {
		A1.commonState = true;
		A2.commonState = true;
	}



бугагагага (демонический смех)
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38147064
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин,

а серьезно? просто я созадю коллекцию, а такого метода не вижу
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38147382
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Озверин,

а серьезно? просто я созадю коллекцию, а такого метода не вижу

Вы знаете, что такое статические поля, методы?
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38147387
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Озверин,

а серьезно? просто я созадю коллекцию, а такого метода не вижу

Или вы о авторчто за метод byType??
Скорее всего имелся ввиду "свой" метод, что-нибудь вроде:

public class ExArrayList<T> extends ArrayList<T> {
public List<T> byType(Class cls) {
//формирование листа
//...
//
return list;
}
}
...
Рейтинг: 0 / 0
Какие альтернативы есть у instanceOf
    #38148573
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин,

дааа, я про свой метод
...
Рейтинг: 0 / 0
60 сообщений из 60, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Какие альтернативы есть у instanceOf
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]