|
|
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
Dynamic Proxy позволяют заменяет вызов всех методов реализуемых интерфейсов некого класса на вызов метода InvocationHandler#invoke. А в чем смысл, если мы можем использовать для этих целей наследование и полиморфизм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 16:25:38 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
Смысл в том чтобы для всех методов одного интерфейса выполнить одно и то же действие. Для того чтобы реализовать это через полиморфизм, необходимо создать класс для каждого метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 16:34:29 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
Про AOP что-нибудь слышали? Вот это классический AOP как раз. Он сделан как раз специально, что бы не приходилось делать никакого наследования (ну а полиморфизм тут вообще не подходит) для внедрения вспомогательных операций (секьюрити, логирование, LazyLoading и т.д.). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 16:35:09 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
Писали же не так давно:) Если кратко то основные причины 1) А что если классы не известны на момент загрузки? отчего наследоваться? 2) AOP, Разместить логику, непосредственно не относящуюся к обязанности класса и пересекающуюся для многих классов, в одном централизованном месте гораздо лучше. 3) А что если операция создания проксированного объекта довольно тяжеловесна, а в некоторых случаях хватит прокси? Пример - Hibernate findById() Есть конечно и минусы 1) Трудность дебага 2) Overengineering Динамик прокси не стоит пихать везде, где только можно, на это должна быть причина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 16:38:12 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
забыл никДинамик прокси не стоит пихать везде, где только можно, на это должна быть причина. +1 извечная проблема баланса динамика --- статика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 16:41:26 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
BlazkowiczСмысл в том чтобы для всех методов одного интерфейса выполнить одно и то же действие. Для того чтобы реализовать это через полиморфизм, необходимо создать класс для каждого метода. Зачем? Если у нас есть интерфейс с несколькими методами, то мы создаем только один класс с реализацией этих методов... Не понял зачем создавать несколько классов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 17:10:53 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
OOsalivanЗачем? Если у нас есть интерфейс с несколькими методами, то мы создаем только один класс с реализацией этих методов... Не понял зачем создавать несколько классов? Как вы будете выполнять один и тот же код в каждом методе? Копировать вызов утилитного метода в каждый метод реализации? Proxy нужны не для того чтобы "реализовывать интерфейсы". Обычно, они проксируют конкретную реализацию интерфейса. Пример. У вас есть интерфейс и две реализации. Результат работы каждого метода вам нужно поместить в кэш. Напишите как это будет выглядеть через ООП и полиморфизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 17:21:48 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
Возможно у вас ещё возникло недопонимание из-за использования интерфейса. Это только ограничение Java Reflection. В реальной жизни Dynamic Proxy можно реализовать и на классе, без каких-либо интерфейсов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 17:33:42 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
BlazkowiczOOsalivanЗачем? Если у нас есть интерфейс с несколькими методами, то мы создаем только один класс с реализацией этих методов... Не понял зачем создавать несколько классов? Как вы будете выполнять один и тот же код в каждом методе? Копировать вызов утилитного метода в каждый метод реализации? Proxy нужны не для того чтобы "реализовывать интерфейсы". Обычно, они проксируют конкретную реализацию интерфейса. Пример. У вас есть интерфейс и две реализации. Результат работы каждого метода вам нужно поместить в кэш. Напишите как это будет выглядеть через ООП и полиморфизм. Опять не совсем понятны условия задачи? Где тут проблема? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 18:24:44 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
OOsalivanГде тут проблема? При добавлении метода в Animal, кеширование для него само не появится. Для каждого нового метода нужно добавлять кеширование. Так? Я имел ввиду полноценное кеширование. Упростите пример ниже через OOP Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 18:35:52 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
А теперь добавь метод getSurName() для каждого наследника, и представь что тупоголовый заказчик хочет выводить имя в UPPER_CASE, тупой пример но иллюстративный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 18:37:22 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
У Blazkowicz пример лучше:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 18:38:20 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
BlazkowiczУпростите пример ниже через OOP Вариант уноса кэша на уровень репозитория не рассматриваем. Представим что все данные грузятся разными методами: Repository.loadCatName(); Repository.loadDogName(); т.е. это разные источники данных, модифицировать которые не выйдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 18:41:40 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
BlazkowiczBlazkowiczУпростите пример ниже через OOP Вариант уноса кэша на уровень репозитория не рассматриваем. Представим что все данные грузятся разными методами: Repository.loadCatName(); Repository.loadDogName(); т.е. это разные источники данных, модифицировать которые не выйдет. Могу предложить что ниже, но если принимать, что "все данные грузятся разными методами", то можно создать дополнительный енум с перечислением всех животных и впихнуть ветвление в switch case, правда это получиться не ООП. Но с другой стороны я не пойму каким образом нам облегчит код использование Dynamic Proxy? Код: 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. 61. 62. 63. 64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2012, 23:50:44 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
OOsalivan, отличие Dynamic Proxy от того варианта, который вы привели в том, что ваш вариант статичен. Вы получаете байт-код при компиляции и далее уже не можете его изменить. Пример: Код: 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. имеем 2 интерфейса и m и k их реализаций. Заранее не известно, объект какого типа нужно вернуть и с какими реализациями. Можно конечно написать класс у которого будут методы типа "getImplIntfss()", "getImplObj(Class<?> intf)", который будет при создании получать аргументы - классы интерфейсов, которые он реализует, и реализующие их объекты. Этот вариант не прозрачен и не удобен, потому что часто приходится состыковывать различные библиотеки, разработчики которых об этом классе ничего не знают. В случае же с DynamicProxy создаётся объект нового класса. Именно нового, так как создаётся новый байт код для этого класса. Так во всяком случае реализовано в OpenJDK. Далее этот объект можно прозрачно передавать куда угодно. И пользоваться всеми благами reflection и др. инструментами, как будто мы при написании кода определили именно этот класс который реализует только те интерфейсы, которые нам нужны и с теми реализациями, которые нам нужны. Ну и как ещё один плюс - дополнительный слой логики, который мы можем поместить при вызове всех методов прокси-объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2012, 11:42:15 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
OOsalivanМогу предложить что ниже, но если принимать, что "все данные грузятся разными методами", то можно создать дополнительный енум с перечислением всех животных и впихнуть ветвление в switch case, правда это получиться не ООП. Но с другой стороны я не пойму каким образом нам облегчит код использование Dynamic Proxy? В вашем варианте при 10-20 методах доступа, соответственно такой же длины будет switch/case. И чем больше проект, тем больше этот метод. Причем полиморфизма там уже не может быть никак. Код с прокси выглядит, грубо говоря, вот так. При чем, не зависимо от того сколько у вас нужно прокешировать методов и в каких классах, реализации InvokationHandler не изменится. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2012, 12:56:21 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
Miha_S7отличие Dynamic Proxy от того варианта, который вы привели в том, что ваш вариант статичен. Да, очень верное замечание. OOSalivan реализовал статический прокси, который тоже имеет право на жизнь, если никакой возможности использовать AOP нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2012, 12:57:51 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Разве это не тот же switch case придеться дописывать? Вызовы Repository.loadName, Repository.loadColor в коде выше не указанны. А switch case в том что я писал ранее именно разруливают когда какие методы Repository вызывать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2012, 18:27:50 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
OOsalivanРазве это не тот же switch case придеться дописывать? Вызовы Repository.loadName, Repository.loadColor в коде выше не указанны. А switch case в том что я писал ранее именно разруливают когда какие методы Repository вызывать method.invoke вызовет ту реализацию, которая написана у класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2012, 18:40:03 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
BlazkowiczOOsalivanРазве это не тот же switch case придеться дописывать? Вызовы Repository.loadName, Repository.loadColor в коде выше не указанны. А switch case в том что я писал ранее именно разруливают когда какие методы Repository вызывать method.invoke вызовет ту реализацию, которая написана у класса. Т.е мы знаем что некий класс какимто образом реализет интерфейс (например Animal) и если мы хотим обернуть вызов метода String getName() в некий дополнительный код Код: java 1. 2. 3. 4. 5. То в этом случае используем прокси? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2012, 19:15:20 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
OOsalivan, тут нужно подумать, для подобных целей есть ещё такая штука как декоратор. Всё зависит от задачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:14:21 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
Miha_S7OOsalivan, тут нужно подумать, для подобных целей есть ещё такая штука как декоратор. Всё зависит от задачи О чем я изначально в теме и говорю : Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:35:36 |
|
||
|
смысл в Dynamic Proxy Classes
|
|||
|---|---|---|---|
|
#18+
OOsalivan, ну сами подумайте, вам же уже писали, что декоратор и статичный код в некоторых случаях неудобен. Да, с помощью декораторов можно решить задачу, но придётся пихать один и тот же код(если это нужно) в каждый метод. И, использовать декоратор вы сможете только для заранее определённого набора интерфейсов и этот набор вы не сможете менять в рантайме, то есть код у вас будет статичный. Dynamic Proxy Classes ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2012, 11:51:48 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37626735&tid=2132759]: |
0ms |
get settings: |
14ms |
get forum list: |
22ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
62ms |
get topic data: |
22ms |
get forum data: |
5ms |
get page messages: |
112ms |
get tp. blocked users: |
3ms |
| others: | 369ms |
| total: | 625ms |

| 0 / 0 |
