Почему не делегаты .NET, а не замыкания на Java?
Хорошо, это будет мое избиение умирающей лошади в третий раз.
Однако этот вопрос отличается от моих предыдущих двух о закрытиях/делегатах, которые спрашивают о планах для делегатов и каковы прогнозируемые спецификации и реализация для закрытия.
Этот вопрос связан с тем, почему сообщество Java пытается определить 3 разных типа замыканий, когда мы могли просто украсть всю концепцию блокировки, акций и ствола делегатов от нашего любимого и дружелюбного соседа - Microsoft.
Есть два нетехнических вывода, на которые я бы очень захотел вскочить:
- Сообщество Java должно сохранить свою гордость за счет того, что вам нужно изо всех сил пытаться изо всех сил, не поддаваясь заимствованию каких-либо концепций Microsoft или иным образом оправдывая блеск Microsoft.
- Делегаты - запатентованная технология Microsoft.
Хорошо, помимо вышеупомянутых двух возможностей,
Q1. Есть ли недостаток или неадекватность делегатов в .NET-стиле, что три (или более) формы закрытия будут обращаться?
Q2. Я прошу об этом, переходя между Java и С#, и это меня интригует, что делегаты С# делают именно то, что мне нужно. Существуют ли функции, которые будут реализованы в закрытии, которые в настоящее время недоступны делегатам С#? Если да, то каковы они, потому что я не вижу, что мне нужно больше, чем предоставили мне делегаты С#?
Q3. Я знаю, что одной из проблем, связанных с внедрением закрытий/делегатов в java, является сокращение ортогональности языка, где более одного способа подвергается выполнению конкретной задачи. Стоит ли уровень свертки и время, затрачиваемое на то, чтобы избегать делегатов, чтобы гарантировать, что java сохраняет свой уровень ортогональности? В реляционном дизайне мы знаем, что желательно нарушить ортогональность, часто адекватно удовлетворяя только 2-й нормальной форме. Почему для простоты java не может быть сокращено ортогональность и OO-n?
Q4. Архитектура JVM технически ограничена в реализации делегатов в формате .NET. Если эта причина WERE (сослагательное наклонение, чтобы подчеркнуть маловероятность) истинна, то почему не могут быть скрыты три предложения закрытия за простым ключевым словом или аннотацией делегата: если мы не любим использовать @delegate, мы могли бы использовать @method. Я не вижу, как формат заявления делегата более сложный, чем три предложения закрытия.
Ответы
Ответ 1
Ваш вопрос ироничен. Вам интересно, почему сообщество Java борется с тремя различными предложениями для добавления закрытий, и ваше предлагаемое решение состоит в том, чтобы добавить четвертый вариант в микс?
Но чтобы ответить на ваш вопрос:
-
Правильный форум для обсуждения - это список рассылки openjdk project lambda. Это не то место, где предложения могут повлиять на эти усилия.
-
Системы типов для С# и Java существенно различаются, поэтому решение С# не будет применяться напрямую. Например, С# имеет отклонение на уровне объявления (in/out), тогда как java имеет разницу в использовании сайта (подстановочные знаки). Вывод типов параметров lambda, как указано в С#, не будет применяться в Java.
-
Эволюция Java должна оставаться обратной совместимостью, но добавление ключевого слова delegate было бы нарушением изменений.
-
С# имеет три типа делегатских выражений: старый с ключевым словом delegate, оператор lambdas with = > {и выражение lambdas. Если команда языка С# имеет это сделать снова, у нас, конечно же, не будет таких разных форм. Почему Java должен использовать С# исторический багаж?
-
Поскольку генераторы С# работают над примитивами, типы делегатов Func < > и Action < > могут использоваться как типы структурных функций бедных. Но в Java дженерики стираются, работают только над ссылочными типами, а типы не могут различаться по своей природе. Следовательно, для получения такого же эффекта у Java должно быть большое количество четко обозначенных "стандартных" типов функций. Это было бы не так.
В целом, решение С# не адаптируется к очень естественному решению на Java.
Ответ 2
С# имеет закрытие в дополнение к делегатам. На мой взгляд, они не такие.
delegate = указатель функции.
clos = {function, environment}.
Способ определения [анонимной] функции и ее упаковки в среде. Строго говоря, последнее следует назвать только замыканием, первое - "лямбда-выражением".