|
|
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть ли в Java возможность, как в Delphi, присвоить переменной процедуру(функцию) чтобы потом вызвать ее. Пример: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 12:14 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
По-простому нет. Есть Reflection API - Method.invoke() Есть MethodHandler, назначение которого не особо понятно. Есть всяческие утилиты работы с JavaBeans, которые скрывают рутину Reflection API. Есть Guava, которая позволяет писать в более функциональном стиле (ведь обычно в этом случае нужна ссылка на функцию) На подходе Java 8 с лямбдами и функциональными интерфейсами. Не совсем аналог ссылки на метод, но можно реашить готовыми классами в гораздо более простом стиле. Для выбора правильного решения нужно понять зачем вам это понадобилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 12:23 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
Аа... ну и совсем забыл. Можно тупо обернуть желаемый код в анонимный класс Callable/Runnable и его исопльзовать как ссылку на этот код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 12:27 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
BlazkowiczДля выбора правильного решения нужно понять зачем вам это понадобилось. Скажем есть класс А в котором метод, который должен быть реализован в классе Б использующим класс А, но не унаследованном. т.к. класс А может использоваться в 20 разных классах Б и каждый должен иметь свою реализацию метода класса А (например вывод на экран). Раз такого нет, значит будем через наследование переопределять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 12:34 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
Bridge? Две иерархии? Очень секретная предметная область, поэтому приходится объяснять на пальцах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 12:36 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
Не совсем понял о чем вы. Вообщем я реализовываю базовый абстрактный класс для трансформации XML сообщения из одного в второе. В этом классе будут указаны основные методы, часть из которых будут переопределены в наследнике. Класс-наследник собственно будет отвечать за конкретную трансформацию. Во время трансформации надо выводить сообщения. Класс-наследник понятия не имеет куда ему выводить сообщения, т.к. его вызывает стороннее приложение. Поэтому идеология такая, что уже в стороннем приложении будет реализован этот метод, который будет выводить на экран. Ну и в стороннем приложении создается экземпляр класса-наследника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 12:44 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
И обычный логгер никак не подходит? В каком виде сообщения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 12:52 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
Есть, но в Java 8. Почитайте про lamda. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 13:06 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
А чем вас готовые логгеры не устроили типа log4j2, они расширяемы под любые нужды.Зачем велосипед? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 13:08 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
BlazkowiczИ обычный логгер никак не подходит? В каком виде сообщения? Для стороннего приложения реализуется класс унаследованный от некоего класса предоставляемого библиотекой приложения. Класс который мы реализовали, подключается в стороннем приложении и подхватывается. Соответственно стороннее приложение предоставило свои методы для отображения информации. Вообщем. Приложение это SAP PI. Я реализовываю Java Mapping для него. К проекту подключается библиотека SAPMapping и переопределяется класс и некоторые методы из библиотеки. В некоторых методах параметрами выступают классы реализованные в библиотеке. Они и отвечают за вывод на экран. Для того, чтобы не писать один и тот же код 100 раз, для 100 Mapping'ов. Я реализовываю собственную библиотеку, которая будет уметь преобразовывать XML сообщение из одного состояния в другое, но эта библиотека ничего не должна знать о библиотеке SAP. Соответственно вызывать в ней функции реализованные в бибилотеке SAP мы не можем. Поэтому я хочу вызвать функцию абстрактно, чтобы она была реализована в проекте, который переопределил класс SAPи который использует мой класс для преобразования. В целом я эту проблему (правда в J2ME) когда-то решал через Интерфейсы, попробую и сейчас сделать также. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 13:12 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
TrogloditЕсть, но в Java 8. Почитайте про lamda. Есть ключевая разница в том что ссылку на любой метод в Delphi\C++ можно иметь как обычный указатель. С лямдами такой финт не пройдёт. Ссылка на метод должна быть обязательно оформлена как типизированый функциональный интерфейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 13:14 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
BlazkowiczTrogloditЕсть, но в Java 8. Почитайте про lamda. Есть ключевая разница в том что ссылку на любой метод в Delphi\C++ можно иметь как обычный указатель. С лямдами такой финт не пройдёт. Ссылка на метод должна быть обязательно оформлена как типизированый функциональный интерфейс. Я с этим не спорю, но на мой взгляд это самое близкое, т.е на 90%, т.к. сам смысл функциональный интерфейс-это интерфейс с ОДНИМ функ. методом, при этом вы можете передать ссылку на любой метод класса, который подходит в этом случае, имхо это очень похоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 13:20 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
X-CiteНе совсем понял о чем вы. Вообщем я реализовываю базовый абстрактный класс для трансформации XML сообщения из одного в второе. В этом классе будут указаны основные методы, часть из которых будут переопределены в наследнике. Класс-наследник собственно будет отвечать за конкретную трансформацию. Во время трансформации надо выводить сообщения. Класс-наследник понятия не имеет куда ему выводить сообщения, т.к. его вызывает стороннее приложение. Поэтому идеология такая, что уже в стороннем приложении будет реализован этот метод, который будет выводить на экран. Ну и в стороннем приложении создается экземпляр класса-наследника. А что мешает в "Классе-наследнике" писать Logger.info("Message"); А в классе, который отвечает за отображение объявить Listener и делать всю логику по отображению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 13:28 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
X-CiteНе совсем понял о чем вы. Вообщем я реализовываю базовый абстрактный класс для трансформации XML сообщения из одного в второе. В этом классе будут указаны основные методы, часть из которых будут переопределены в наследнике. Класс-наследник собственно будет отвечать за конкретную трансформацию. Во время трансформации надо выводить сообщения. Класс-наследник понятия не имеет куда ему выводить сообщения, т.к. его вызывает стороннее приложение. Поэтому идеология такая, что уже в стороннем приложении будет реализован этот метод, который будет выводить на экран. Ну и в стороннем приложении создается экземпляр класса-наследника. Как вариант, объявите в базовом абстрактном классе абстрактный метод "вывСообщ". Оставьте его абстрактным в реализации. И уже в стороннем приложении определите. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. И никаких функций-переменных не потребовалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 15:10 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
X-CiteВ целом я эту проблему (правда в J2ME) когда-то решал через Интерфейсы, попробую и сейчас сделать также. Судя по описанию задачи - шаблон Наблюдатель в чистом виде. И да, там нужны интерфейсы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 16:26 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
TrogloditЯ с этим не спорю, но на мой взгляд это самое близкое, т.е на 90%, т.к. сам смысл функциональный интерфейс-это интерфейс с ОДНИМ функ. методом, при этом вы можете передать ссылку на любой метод класса, который подходит в этом случае, имхо это очень похоже. Близкое по синтаксису. А идеологически оно и без лямбд реализуется точно так же, через тот же Callable. Разницы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 16:32 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
Получилось, что-то такое: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 16:37 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
Жаль что в Java нет процедурного типа как в Delphi. Реализовывать иерархию классов было бы намного гибче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 16:45 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
делаете кучу интерфейсов Код: java 1. делаете вместо методов поля Код: java 1. 2. 3. ссылаетесь на них Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 16:52 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
Однако стоит заметить что в итоге после хорошего рефакторинга нужда в этих костылях отпадает, ибо Java позволяет более гибко подойти к организации кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 17:01 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
X-CiteЖаль что в Java нет процедурного типа как в Delphi. Реализовывать иерархию классов было бы намного гибче. Жаль что Java не даёт наколбасить нечитаемое спаггети и требует более раздельного и строгого ООП подхода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 17:11 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
X-CiteЕсть ли в Java возможность, как в Delphi, присвоить переменной процедуру(функцию) чтобы потом вызвать ее.Такая возможность имеется. Через Reflection: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 09:24 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
X-CiteЖаль что в Java нет процедурного типа как в Delphi. Реализовывать иерархию классов было бы намного гибче. по справедливости, в дельфях делают через подписку класса на события. Код: pascal 1. 2. ...впрочем, код на Delphi ты не показал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2013, 10:49 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНа подходе Java 8 с лямбдами и функциональными интерфейсами. Не совсем аналог ссылки на метод MethodReference.. java 8 (instance method) Код: java 1. 2. 3. 4. 5. 6. 7. java 8 (static method) Код: java 1. 2. 3. 4. 5. 6. 7. Ну и в байткоде (начиная с 7ой джавы) есть method handle (указатель на метод). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2013, 23:55 |
|
||
|
Переменная как функция
|
|||
|---|---|---|---|
|
#18+
avp.mkMethodReference.. Точно так же и в Java <8 реализуется через анонимный класс. avp.mkНу и в байткоде (начиная с 7ой джавы) есть method handle (указатель на метод). Оно есть не только в байткоде. Но с точки зрения удобства мало чем отличается от рефлексии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2013, 10:03 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38427578&tid=2127576]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
164ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 486ms |

| 0 / 0 |
