Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Ссылка на метод в Java


Автор: woland 4.9.2008, 09:43
В java можно передать как параметр, например, в функцию ссылку на объект, а можно ли как-то передать ссылку на метод объекта?

Автор: SaSho 4.9.2008, 09:57
В принципе можно. Используя Reflection API. 
Вот только это нужно далеко не всегда. Можно узнать зачем?

Автор: woland 4.9.2008, 10:14
Нужно между двумя объектами создать связь. Объект B должен при изменении свойства объекта A вызывать метод объекта C. Свойств может быть много, изменению каждого из них соответствует свой метод в классе C.

Видится так что в объекте В будет создана связь между свойством объекта A и методом(ссылкой на него) объекта С.

Автор: Platon 4.9.2008, 10:29
Уважаемый, вам стоит посмотреть шаблон "Посредник" (Mediator), а лучше "Слушатель". Если вы делаете не тестировочное ПО, которое работает в условиях полной неопределенности.

Добавлено через 1 минуту и 24 секунды
Вообще, шаблон MVC - устоявшийся пример вашей задачи.

Автор: Ortega 4.9.2008, 10:34
SaSho, ты советуешь человеку плохую каку. Имхо, человек не должен даже догавдываться о существовании Reflection API до определенного уровня развития как Java-программиста. 
В Java нет ссылок на методы как таковых. Есть полиморфизм. И есть паттерны проектирования. 

woland, для твоего случая хорошо подойдет паттерн http://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F). Или http://ru.wikipedia.org/wiki/Model-View-Controller.

Автор: SaSho 4.9.2008, 10:47
Цитата(Ortega @  4.9.2008,  10:34 Найти цитируемый пост)
SaSho, ты советуешь человеку плохую каку. 

Ну так изначально не было никакой информации о том, для чего это нужно. Посмотри на первый пост. Потому я и спросил зачем это топикстартеру. 

Автор: serious 4.9.2008, 11:49
В Java не передаются ссылки на методы, передаются ссылки на объекты, содержащие нужные методы.

Автор: Samotnik 4.9.2008, 11:55
woland,  http://www.javenue.info/post/76#more-76

Автор: woland 4.9.2008, 12:47
Если я правильно понял:

1. Шаблон "Наблюдатель" предлагает использовать один метод который будет дергаться наблюдаемым. То есть не позволяет дергать разные функции при изменении разных свойств?

2. Шаблон "Медиатор" предлагает писать кучу классов, по большому счету одинаковых, только с разной реализацией одного метода, который дергает Медиатор?

Я правильно понял?

Автор: Ortega 4.9.2008, 13:39
Цитата(woland @  4.9.2008,  12:47 Найти цитируемый пост)
Если я правильно понял:

1. Шаблон "Наблюдатель" предлагает использовать один метод который будет дергаться наблюдаемым. То есть не позволяет дергать разные функции при изменении разных свойств?

2. Шаблон "Медиатор" предлагает писать кучу классов, по большому счету одинаковых, только с разной реализацией одного метода, который дергает Медиатор?

Я правильно понял?

В общем и целом, да. 
Если ты считаешь, что тебе это не подходит - задумайся о том, что в метод, дергаемый наблюдателем можно передавать параметры. 

Автор: woland 4.9.2008, 13:47
Передать-то можно, можно сделать этот метод этаким коммутатором, ему будет передаваться объект и свойство, а он будет в соответствии с этим вызывать метод внутри себя. Но какой-то не очень красивый вариант решения :(. Хотя похоже единственный.

Автор: woland 4.9.2008, 15:23
Подумав, решил выбирать между http://java.sun.com/docs/books/tutorial/reflect/member/methodInvocation.html и http://www.cutthecrap.biz/software/delegates.html . Чего выбрать из двух зол? smile

Автор: Platon 4.9.2008, 18:55
Цитата(woland @  4.9.2008,  16:23 Найти цитируемый пост)
Подумав

такое ощущение, что нет.
Эти два метода были уже озвучены. Все хором тебе советуют делать 2-й вариант.

Автор: w1nd 4.9.2008, 21:04
Цитата(Ortega @  4.9.2008,  10:34 Найти цитируемый пост)
В Java нет ссылок на методы как таковых.

И очень зря. Статически проверяемые ссылки на методы просто необходимы. А полиморфизм тут вообще не при чём.

Автор: SoulKeeper 5.9.2008, 09:52
Цитата(w1nd @  4.9.2008,  21:04 Найти цитируемый пост)
И очень зря. Статически проверяемые ссылки на методы просто необходимы. А полиморфизм тут вообще не при чём. 


Ну добавят ссылки на методы, макросы, платформо-зависимые компоненты, возможность управлять памятью вручную и получится какой-то J++.

Текущих возможностей джавы хватает с головой, проблема не в отсутсвии возможностей, а в изначально неправильном подходе к реализации.

P.S. Имхо smile

Автор: Ortega 5.9.2008, 10:02
SoulKeeper, ППКС

Автор: w1nd 5.9.2008, 11:10
Цитата(SoulKeeper @  5.9.2008,  09:52 Найти цитируемый пост)
Ну добавят ссылки на методы, макросы, платформо-зависимые компоненты, возможность управлять памятью вручную и получится какой-то J++.

Не стоит драматизировать, SoulKeeper. Указатели на методы и макросы не есть явления одного порядка с платформо-зависимыми компонентами и управлением памятью. Хотя платформо-зависимые компоненты, как java extension, не помешали бы smile

Цитата(SoulKeeper @  5.9.2008,  09:52 Найти цитируемый пост)
Текущих возможностей джавы хватает с головой, проблема не в отсутсвии возможностей, а в изначально неправильном подходе к реализации.

С головой хватает и возможностей ассемблера. С головой хватает и возможностей hex-редактора. Только вот лопатой очень много махать smile

Автор: Ortega 5.9.2008, 12:02
Насколько я что-то понимаю, ссылки на функции - реализация полиморфизма в структурных языках программирования. 
В Java для этого есть другие механизмы. 
Человеку, больше привыкшему к тому же Си, это кажется неудобным и неправильным. Однако нужно понимать, что если механизмы другие, то и подход должен быть другой. 

Автор: w1nd 5.9.2008, 17:20
Цитата(Ortega @  5.9.2008,  12:02 Найти цитируемый пост)
Насколько я что-то понимаю, ссылки на функции - реализация полиморфизма в структурных языках программирования.

Неправильно понимаете. В java, конечно, есть механизмы, с помощью которых можно возместить отсутствие рекомого в некоторых ситуациях. Например, вместо указателя на функцию может передаваться экземпляр интерфейса. Причём вариант с объектом интерфейса значительно более громоздок и благодаря отсутствию макросов с этим ничего нельзя сделать. Я уже не говорю, насколько более гибкий и лаконичный механизм можно построить, используя параметризованные ссылки на методы.

Но это только одна сторона вопроса. Более чем в половине случаев использования рефлексии имена методов и базовые классы известны заранее. Наличие ссылок на методы избавило бы от поиска методов класса, от обработки целой кучи исключений, от ошибок, возникших из-за элементарных опечаток.

Автор: SoulKeeper 5.9.2008, 20:15
Для чего рефлексия то для заранее известного? Интерфейсы и кастинг типов уже отменили?

Автор: w1nd 6.9.2008, 15:20
Цитата(SoulKeeper @  5.9.2008,  20:15 Найти цитируемый пост)
Для чего рефлексия то для заранее известного? Интерфейсы и кастинг типов уже отменили?

SoulKeeper, я же уже писал, для чего - чтобы избавиться от громоздких конструкций в коде, от так называемых "рюшечек". Например для того, чтобы для обработки событий не требовалось бы создавать анонимный класс (и класс - адаптер, поставляющий заглушки для методов интерфейса).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)