|
|
|
Как опредить тип элемента коллекции, если у них общий 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 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, ok теперь понял :). согласен. Озверин, она слишком мелкая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:25:38 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
авторИсходная постановка задачи: нарисовать карту нас. пункта, причем нас. пункт не фиксирован, а имеет произвольную структуру. Я решил использовать паттерн Компоновщик. В последний момент попросили заимплементить функцию, которая отображает, сколько в агрегате всего деревьев (кроме них еще есть дома и пустыри)... в связи с этим возник топик В принципе в вашем случае можно обойтись и instanceof, но когда он появляется хотя бы один раз, то провоцирует в дальнейшем на добавление еще одной ветки и т.п., не clean ООП. В вашем случае, предвидя, что вас скорее всего потом попросят добавить а сколько пустырей и сколько домов, то я бы сделал так. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:48:48 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Хотя нет, я бы в самом композите это и разместил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 15:49:51 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
ЖентосМне нужно, чтобы эта коллекция могла иметь представление в виде "составной объект – его части", и был реализован одинаковое обращение к этим элементам коллекции... но вот, получилось, что коллекцию надо перебрать "через один" в очень редком случае. Даже не знаю, как лучше поступить Перебрать через один и сделать с элементами что? Код: java 1. 2. 3. 4. 5. Если нужно пропустить элемент коллекции, тогда в интерфейс можно добавить метод, который у большинства классов не будет ничего делать, а только у нужного класса будет. Либо же из этих исключительных классов можно сделать отдельный список, и передавать его уже в другой метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 18:42:00 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
HoBTID, У него составные объекты. Парент Чилд Парент Чилд :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 19:17:04 |
|
||
|
Как опредить тип элемента коллекции, если у них общий superclass
|
|||
|---|---|---|---|
|
#18+
Если много операций подобного типа , и есть неприязнь к "instanceof", Visitor предпочтительее. Код: 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. 55. 56. 57. 58. 59. 60. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 19:43:15 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2132754]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
1ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 364ms |
| total: | 516ms |

| 0 / 0 |
