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

Почему не делегаты .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. Я не вижу, как формат заявления делегата более сложный, чем три предложения закрытия.

4b9b3361

Ответ 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}. Способ определения [анонимной] функции и ее упаковки в среде. Строго говоря, последнее следует назвать только замыканием, первое - "лямбда-выражением".