Подтвердить что ты не робот

Почему Java не имеет делегатов метода?

Гурунуты Java (natha नाथ = санскрит для божества-мастера-защитника) в Sun должны снисходить, чтобы принять необходимость делегатов и подготовить их к спецификации Java.

В С# я могу передать метод в качестве обработчика, на который ссылается как делегат, не требуя проблемы с созданием класса только потому, что мне нужно передать метод в Java.

В чем причины, из-за которых это необязательно (помимо цитирования неуклюжего использования совершенно нового класса для этой цели) или невыгодно, что Sun решила не иметь его на Java? Какие преимущества дает анонимное создание класса или реализации интерфейсов над делегатами? Я не могу думать ни о чем, не так ли?

4b9b3361

Ответ 1

Вот Tom Ball account для предложения Microsoft, чтобы добавить их на Java и почему Sun отклонила их.

IMO, Java должна была закрыться двенадцать лет назад. Гилад Брача утверждал за закрытие, и никто не слушал. По его собственным словам:

Я лично выступал за добавление закрытий с 1997/98 года. Моя кровь     давление все еще заметно возрастает, когда я вспоминаю ответ, который я получил     в то время: "Наши клиенты не просят об этом, так зачем добавлять его?".

Печально, но верно.

Ответ 2

[Малые изменения]

Позвольте мне сначала сказать, что я не против или в пользу добавления делегатов на Java. Я просто объясняю фон.

Во-первых, команда Sun Java традиционно более консервативна (по сравнению с командой С#) относительно эволюции языка.

Во-вторых, добавление конструкции делегата в Java, вероятно, потребует введения нового ключевого слова, например: "делегировать". Это нарушит существующий код, в котором есть переменные с именем "делегат".

В-третьих, существует такой принцип проектирования, который называется "Принцип единого выбора" http://en.wikipedia.org/wiki/Single_choice_principle. При применении к языковому дизайну это означает, что у программиста должен быть только один очевидный способ добиться чего-то. Или, другими словами, множественный выбор является рискованным. Введение делегатов в Java будет работать против этого принципа, поскольку их поведение может быть достигнуто с помощью анонимных классов.

[Конечно, этот принцип не следует воспринимать буквально. Если бы это было тогда, мы будем программировать с доброй старой машиной Тьюринга. Я думаю, что ребята из Sun почувствовали, что делегаты не представляют собой преимущества, которые перевешивают нарушение единственного выбора]

Ответ 3

Простота.

Не вводя понятие делегатов в Java, они упростили язык. Так же, как отсутствие свойств, индексаторов,....

(используя более простой язык, кстати, не обязательно проще, вероятно, они должны были добавлять делегатов, но не так, как они принимали проектные решения)

Ответ 4

java не имеет замыканий, потому что он не предназначен для функционального языка, а для объектно-ориентированного. так как во многих случаях вы можете подделать парадигму другого языка, в этом случае используя анонимные интерфейсы вместо закрытия.
но теперь все меняется и под давлением новых jvm-языков, таких как scala, groovy, jruby и т.д., который объединяет оо и функциональные парадигмы, java-комитет пытается помещать замыкания в java 7.

Ответ 5

В Java у вас есть внутренние классы, которые привязаны к одному конкретному экземпляру родительского класса и имеют прямой доступ к его членам. Таким образом, реализация внутреннего класса не требует (много) больше кода, чем написания метода.

С# не имеет внутренних классов. Оба внутренних класса (как в Java) и делегаты (как на С#) имеют свои преимущества (иногда я пропускаю внутренние классы на С#), но с точки зрения дизайнера языка имеет смысл придерживаться либо одного из них (а не поддерживать оба), поскольку это делает дизайн библиотеки классов более согласованным.

Ответ 6

Потому что они думали, что:

Ссылки на связанные функции [делегаты] просто не нужны. [...] Кроме того, они умаляют простоту и единство языка Java. Связанные ссылки методов не являются правильным путем для будущего развития языка.

Взято из этой (старой) белой бумаги:

http://java.sun.com/docs/white/delegates.html

Теперь Java рассматривает возможность добавления их, как только язык достаточно развит. Я уверен, что они скоро будут на языке (по крайней мере раньше Perl 6: P)

Вы также можете использовать: Программный метод обратного вызова Monkey

Ответ 7

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

Я ДЕЙСТВИТЕЛЬНО люблю делегатов для работы пользовательского интерфейса. Это облегчает программирование оконных действий.

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

Не уверен, что я предпочитаю.

Ответ 8

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

Ответ 9

Делегаты на С# выглядят уродливо для меня. (объявляя что-то переменным, а затем добавляя () после того, как он плохо себя чувствует в ООП)

Кроме того, если вы хотите: "Объект делегирования затем может быть передан в код, который может вызвать ссылочный метод, без необходимости знать во время компиляции, какой метод будет вызываться.

вы можете просто использовать java.lang.reflect.Method

Изменить: Как вы сказали, использование отражения не является хорошим подходом. Это верно, но использование делегатов в перспективе ООП, на мой взгляд, не является лучшим подходом. Это функционально-язычная конструкция.