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

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

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

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

12
задан Rob Fonseca-Ensor 29 December 2009 в 09:23
поделиться

9 ответов

Вот Учетная запись Тома Болла для предложения Microsoft добавить их на Java, и почему Sun отклонил их.

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

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

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

15
ответ дан 2 December 2019 в 03:38
поделиться

[Мелкие правки]

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

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

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

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

.

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

[Конечно же, этот принцип не следует воспринимать буквально.

15
ответ дан 2 December 2019 в 03:38
поделиться

Простота.

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

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

.
6
ответ дан 2 December 2019 в 03:38
поделиться

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

.
4
ответ дан 2 December 2019 в 03:38
поделиться

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

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

.
2
ответ дан 2 December 2019 в 03:38
поделиться

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

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

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

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

.
0
ответ дан 2 December 2019 в 03:38
поделиться

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

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

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

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

.
-2
ответ дан 2 December 2019 в 03:38
поделиться

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

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

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

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

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

Вы также можете использовать: Способ обратного вызова программного обеспечения

1
ответ дан 2 December 2019 в 03:38
поделиться

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

0
ответ дан 2 December 2019 в 03:38
поделиться