Каково текущее состояние спецификации для закрытия Java?
В предложенной спецификации закрытия Java мы смогли бы создать массив или набор закрытий?
Если так, этот синтаксис был бы возможен?
{int x, int y => boolean b}[] comparisonSwitch = {
{int i, int j => return i>j},
{int i, int j => return j<i},
{int i, int j => return j==i}
}
boolean compare(int acase, int a, int b){
return comparisonSwitch[acase].invoke(a,b);
}
Нормальные методы рассмотрели бы как неанонимные закрытия?
Таким образом, следующий синтаксис был бы возможен?
public class Asdf
{
public boolean gt(int x, int y){
return x>y;
}
public boolean lt(int x, int y){
return x<y;
}
public boolean eq(int x, int y){
return x==y;
}
{int x, int y => boolean b} GT = gt;
{int x, int y => boolean b}[] comparisonSwitch = {
gt, lt, eq
}
}
т.е. закрытия и методы interchangeble оперативно?
Следующий синтаксис был бы позволен?
// declare a method that has a closure type as an argument
void closurator( {String s => int a} findlen ){
// do whatever
}
String s = "hello";
void useClosurator(){
// invoke the method by supplying a non-anonymous method
// of an object
closurator(s.indexOf(String ss));
}
Как мы смогли бы указать тип закрытия в интерфейсе?
Мы могли сделать следующий, эффективно объявляющую заключительную/постоянную ссылку на методы.
interface Closuration
{
public class Asdf
{
static public boolean gt(int x, int y){
return x>y;
}
static public boolean lt(int x, int y){
return x<y;
}
static public boolean eq(int x, int y){
return x==y;
}
}
{int x, int y => boolean b}[] comparisonSwitch = {
Asdf.gt, Asdf.lt, Asdf.eq
};
}
Так как закрытия были бы пространство кода доступа, как отражение будет, использование закрытия замедлило бы производительность программы? В противном случае это означало бы, то отражение будет ускорено путем заимствования усовершенствований, сделанных в "технологии закрытия"?
Вставленный новый вопрос: На самом деле закрытие кодировало бы быть частью пространства кода или в переменной "куче", потому что я предсказываю, что код закрытия был бы восприимчив, чтобы быть вытертым сборкой "мусора", правильно?
Позвольте мне запросить Вас сфокусироваться на сути вопросов, не на каких-либо ошибочных/опечатках/пропавших без вести ключевых словах синтаксиса в примере кода. Любые опечатки/ошибки, исправьте их для меня.Спасибо.
Вы спрашиваете о работе замыканий JDK7, поэтому ссылки на javac.info не имеют отношения к делу. Этот сайт посвящен завершенному к настоящему времени проекту openjdk closures , в котором показано, как добавить прозрачные закрытия в Java - прозрачность в смысле соблюдения принципа соответствия Теннента и примерно описана в мой блог .
Работа над JKD7 организована в рамках проекта openjdk lambda . Спецификация быстро развивается, поэтому любые ответы являются предварительными. Как указал Том Хотин, вот последний черновой вариант спецификации .
Прежде чем отвечать на ваши конкретные вопросы, стоит заметить, что в Java есть отдельные пространства имен для переменных и методов. Следовательно, вероятно, будет какое-то синтаксическое различие между вызовом метода и вызовом переменной типа функции (на языке C # - делегата). Точно так же маловероятно, что вы сможете сослаться на метод, просто назвав его, как если бы вы ссылались на поле.
Чтобы ответить на ваши вопросы:
java.util.List
вместо массива. Учитывая, что отдельный проект Coin рассматривает возможность добавления литералов Collection
и операций индексации для List
, это, вероятно, будет столь же синтаксически удобным. Закрытия в JDK7 на данный момент не содержат подробностей. В презентации на Devoxx использованные примеры были очень похожи на предложение о закрытии FCM .
Если предположить, что спецификация используется в JDK7, то я думаю, что ответ на части 2, 3 и 4 вашего вопроса будет положительным (хотя я вполне могу ошибаться).
Что касается части 1 - я думаю, что должна быть возможность иметь массивы, поскольку литералы методов могут быть присвоены объектам Method.
Что касается части 5, я подозреваю, что производительность будет аналогична внутренним классам.
Извините, я немного расплывчатый - надеюсь, это немного поможет. Наверное, еще рано с уверенностью отвечать на ваши вопросы.