|
|
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Есть коллекция "разношерстных" элементов. Коллекция объявлена как ArrayList<ISomeInterface>. В коллекцию помещаются потомки класса SomeClacc, который реализует интерфейс ISomeInterface. Каждый потомок имеет данные, которые отличаю его от других потомков... Как можно определить на элемент какого типа ссылается переменная-счетчик при переборе исходной коллекции... В принципе, мне пришло в голову решение присваивать каждому классу static - тег. И реализовать метод getTag(). Но решил поинтересоваться: а нет ли более красивого решения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:04:49 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Жентос, getClass(), instanceof ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:07:39 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Miha_S7Жентос, getClass(), instanceof ??? Как вариант. Я просто новичок в Java, потому могу всякие элементарные вещи спрашивать. А вот потом можно привести этот элемент явно к нужному мне классу? Или это плохой подход? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:11:52 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Жентос, рискуете норваться на ClassCastException ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:15:49 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
ОзверинЖентос, рискуете норваться на ClassCastException ) Ну вот... а как можно решить эту проблему и не нарваться на исключение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:18:57 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Жентос, cast или просто Код: java 1. 2. 3. 4. + поиск в гугле по "Java type casting" cast довольно распространён. Но нужно с ним повнимательней. Откладывание проверки типов в рантайм - это дополнительный риск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:19:58 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Жентос Если у вас возникла мысль отличать классы, реализующие один интерфейс, значит интерфейс нужно разбить на несколько интерфейсов, и классы сложить в несколько коллекций, а не заниматься преобразованием типов в рантайме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 12:22:17 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
HoBTIDЖентос Если у вас возникла мысль отличать классы, реализующие один интерфейс, значит интерфейс нужно разбить на несколько интерфейсов, и классы сложить в несколько коллекций, а не заниматься преобразованием типов в рантайме. Мне нужно, чтобы эта коллекция могла иметь представление в виде "составной объект – его части", и был реализован одинаковое обращение к этим элементам коллекции... но вот, получилось, что коллекцию надо перебрать "через один" в очень редком случае. Даже не знаю, как лучше поступить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 13:13:59 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Можно например, почитать про паттерн Composite ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 13:22:13 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
забыл никМожно например, почитать про паттерн Composite Это он и есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 13:23:34 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 13:26:09 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Visitor pattern ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 14:08:27 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
grasoff.net, +1 странно, что в java боятся приведения типов и проверки типов в рантайм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 14:49:25 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Petro123+1 странно, что в java боятся приведения типов и проверки типов в рантайм. В подавляющем большинстве случаев это нарушение полиморфизма и недостаток дизайна. Лишь в некоторых случая использование instanceof оправдано простостой реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 14:52:14 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
BlazkowiczPetro123+1 странно, что в java боятся приведения типов и проверки типов в рантайм. В подавляющем большинстве случаев это нарушение полиморфизма и недостаток дизайна. Лишь в некоторых случая использование instanceof оправдано простостой реализации. непонял, что именно нарушение. В Delphi часто делал: - без интерфейсов (полиморфизм) - в массиве классы наследники над базовым. Если достать базовый класс, то вызван будет метод наследника. - с интерфейсами (реже) - проверять на наличие интерфейса. 1 способ мне больше по душе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 14:58:09 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Добрый день, Petro123! > непонял, что именно нарушение. Просто в 90% случаев удаление instanceof приводит к упрощению кода.И делает его много проще. Но надо подумать. > В Delphi часто делал: В delphi та ж фигня. -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:00:48 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
GKS_Samara, я бы и интерфейсы удалил в 99%. Чтобы не пихать куда не надо. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:02:20 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Интерфейсы они на то и интерфейсы чтобы определять абстракцию. А instanceof обходится введением нужной логики в нужные подклассы, на то это и есть полиморфизм. Как правильно сказали, зачастую это признак плохого дизайна, но в некоторых случаях может быть сделано допущение для упрощения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:08:48 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
т.е. при игрушке-рисовалке удобно так: [quote Жентос]Есть коллекция "разношерстных" элементов. Коллекция объявлена как ArrayList<БазовыйКласс>. В коллекцию помещаются потомки класса БазовыйКласс которые перегружают метод Paint(Canvas) - при вызове метода Paint окна, можно одной строкой отрисовать всю коллекцию проходя по коллекции вызвав базовый метод Paint() [/quote] (полиморфизм в рантайме без интерфейса) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:13:53 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Использовал метод товарища grasoff.net Исходная постановка задачи: нарисовать карту нас. пункта, причем нас. пункт не фиксирован, а имеет произвольную структуру. Я решил использовать паттерн Компоновщик. В последний момент попросили заимплементить функцию, которая отображает, сколько в агрегате всего деревьев (кроме них еще есть дома и пустыри)... в связи с этим возник топик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:15:55 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Жентос, да. Как всегда, задачу можно решить 99 разными способами. Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:19:03 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
один я жду в топике леонида и свенома? с последующим холиваром на тему, сколько способов существует для решения этой задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:21:52 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Petro123- без интерфейсов (полиморфизм) - в массиве классы наследники над базовым. Если достать базовый класс, то вызван будет метод наследника. Ну, это о чем я и говорю. Petro123- с интерфейсами (реже) - проверять на наличие интерфейса. Если интерфейс маркерный, то следовало бы использовать аннотации. Если интерфейс с методами, то встаёт логичный вопрос, а почему у нас такой список гетерогенный получился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:21:55 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraПросто в 90% случаев удаление instanceof приводит к упрощению кода. Почему не 91%? GKS_SamaraИ делает его много проще. Но надо подумать. instanceof, действительно часто бывает проще в случае если это - единственная проверка в единственном месте кода, а не разбросаная по разным классам. - если special case - один единственный. Если там будет уже хотя бы 2 if (... instanceof...) подряд, то код только усложняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:25:11 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=314&tid=2132754]: |
0ms |
get settings: |
16ms |
get forum list: |
23ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
41ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 363ms |
| total: | 551ms |

| 0 / 0 |
