![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
woland |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
В java можно передать как параметр, например, в функцию ссылку на объект, а можно ли как-то передать ссылку на метод объекта?
|
|||
|
||||
SaSho |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 10.6.2007 Где: Днепропетровск Репутация: 2 Всего: 3 |
В принципе можно. Используя Reflection API.
Вот только это нужно далеко не всегда. Можно узнать зачем? |
|||
|
||||
woland |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Нужно между двумя объектами создать связь. Объект B должен при изменении свойства объекта A вызывать метод объекта C. Свойств может быть много, изменению каждого из них соответствует свой метод в классе C.
Видится так что в объекте В будет создана связь между свойством объекта A и методом(ссылкой на него) объекта С. |
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Уважаемый, вам стоит посмотреть шаблон "Посредник" (Mediator), а лучше "Слушатель". Если вы делаете не тестировочное ПО, которое работает в условиях полной неопределенности.
Добавлено через 1 минуту и 24 секунды Вообще, шаблон MVC - устоявшийся пример вашей задачи. |
|||
|
||||
Ortega |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
SaSho, ты советуешь человеку плохую каку. Имхо, человек не должен даже догавдываться о существовании Reflection API до определенного уровня развития как Java-программиста.
В Java нет ссылок на методы как таковых. Есть полиморфизм. И есть паттерны проектирования. woland, для твоего случая хорошо подойдет паттерн Observer. Или MVC. --------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
|||
|
||||
SaSho |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 10.6.2007 Где: Днепропетровск Репутация: 2 Всего: 3 |
||||
|
||||
serious |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 15.2.2003 Где: Пенза Репутация: 1 Всего: 1 |
В Java не передаются ссылки на методы, передаются ссылки на объекты, содержащие нужные методы.
-------------------- Я знаю то, что ничего не знаю, а некоторые не знают и этого. |
|||
|
||||
Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
||||
|
||||
woland |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Если я правильно понял:
1. Шаблон "Наблюдатель" предлагает использовать один метод который будет дергаться наблюдаемым. То есть не позволяет дергать разные функции при изменении разных свойств? 2. Шаблон "Медиатор" предлагает писать кучу классов, по большому счету одинаковых, только с разной реализацией одного метода, который дергает Медиатор? Я правильно понял? Это сообщение отредактировал(а) woland - 4.9.2008, 12:53 |
|||
|
||||
Ortega |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
В общем и целом, да. Если ты считаешь, что тебе это не подходит - задумайся о том, что в метод, дергаемый наблюдателем можно передавать параметры. --------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
|||
|
||||
woland |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Передать-то можно, можно сделать этот метод этаким коммутатором, ему будет передаваться объект и свойство, а он будет в соответствии с этим вызывать метод внутри себя. Но какой-то не очень красивый вариант решения :(. Хотя похоже единственный.
|
|||
|
||||
woland |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 22.8.2006 Репутация: нет Всего: нет |
Подумав, решил выбирать между http://java.sun.com/docs/books/tutorial/re...Invocation.html и http://www.cutthecrap.biz/software/delegates.html . Чего выбрать из двух зол?
![]() |
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
такое ощущение, что нет. Эти два метода были уже озвучены. Все хором тебе советуют делать 2-й вариант. |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
И очень зря. Статически проверяемые ссылки на методы просто необходимы. А полиморфизм тут вообще не при чём. -------------------- ![]() ![]() |
|||
|
||||
SoulKeeper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 14.1.2007 Где: Ukraine, Lviv. Репутация: 11 Всего: 15 |
Ну добавят ссылки на методы, макросы, платформо-зависимые компоненты, возможность управлять памятью вручную и получится какой-то J++. Текущих возможностей джавы хватает с головой, проблема не в отсутсвии возможностей, а в изначально неправильном подходе к реализации. P.S. Имхо ![]() |
|||
|
||||
Ortega |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
SoulKeeper, ППКС
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
|||
|
||||
w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Не стоит драматизировать, SoulKeeper. Указатели на методы и макросы не есть явления одного порядка с платформо-зависимыми компонентами и управлением памятью. Хотя платформо-зависимые компоненты, как java extension, не помешали бы ![]()
С головой хватает и возможностей ассемблера. С головой хватает и возможностей hex-редактора. Только вот лопатой очень много махать ![]() Это сообщение отредактировал(а) w1nd - 5.9.2008, 11:22 -------------------- ![]() ![]() |
||||
|
|||||
Ortega |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
Насколько я что-то понимаю, ссылки на функции - реализация полиморфизма в структурных языках программирования.
В Java для этого есть другие механизмы. Человеку, больше привыкшему к тому же Си, это кажется неудобным и неправильным. Однако нужно понимать, что если механизмы другие, то и подход должен быть другой. --------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Неправильно понимаете. В java, конечно, есть механизмы, с помощью которых можно возместить отсутствие рекомого в некоторых ситуациях. Например, вместо указателя на функцию может передаваться экземпляр интерфейса. Причём вариант с объектом интерфейса значительно более громоздок и благодаря отсутствию макросов с этим ничего нельзя сделать. Я уже не говорю, насколько более гибкий и лаконичный механизм можно построить, используя параметризованные ссылки на методы. Но это только одна сторона вопроса. Более чем в половине случаев использования рефлексии имена методов и базовые классы известны заранее. Наличие ссылок на методы избавило бы от поиска методов класса, от обработки целой кучи исключений, от ошибок, возникших из-за элементарных опечаток. Это сообщение отредактировал(а) w1nd - 5.9.2008, 17:21 -------------------- ![]() ![]() |
|||
|
||||
SoulKeeper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 14.1.2007 Где: Ukraine, Lviv. Репутация: 11 Всего: 15 |
Для чего рефлексия то для заранее известного? Интерфейсы и кастинг типов уже отменили?
|
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
SoulKeeper, я же уже писал, для чего - чтобы избавиться от громоздких конструкций в коде, от так называемых "рюшечек". Например для того, чтобы для обработки событий не требовалось бы создавать анонимный класс (и класс - адаптер, поставляющий заглушки для методов интерфейса). -------------------- ![]() ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |