Закрытие на Java 7

Что такое закрытие? Предполагается, что он включен в Java 7. (Закрытия обсуждались для включения в Java 7, но в конце не были включены. -ed) Может ли кто-нибудь указать мне некоторые надежные ссылки, откуда я могу узнать о закрытии?

Ответ 1

Вот блог Neal Gafter, один из пионеров, представляющий закрытие на Java. Его сообщение о закрытии с 28 января 2007 года называется Определение закрытий В своем блоге есть много информации, чтобы вы начали, а также видео, Здесь отличный отклик Google - Расширенные темы на языках программирования - Закрытие для Java с Neal Gafter.

Ответ 2

Закрытие представляет собой блок кода, на который можно ссылаться (и передавать) с доступом к переменным охватывающей области.

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

Java SE 8 предназначен для более сжатой версии этого для интерфейсов с одним методом *, называемых "lambdas". У Lambdas есть те же ограничения, что и анонимные внутренние классы, хотя некоторые детали варьируются в случайном порядке.

Lambdas разрабатываются под Project Lambda и JSR 335.

* Первоначально дизайн был более гибким, позволяя типы Single Abstract Methods (SAM). К сожалению, новый дизайн менее гибкий, но пытается оправдать реализацию реализации в интерфейсах.

Ответ 4

Согласно Tom Hawtin

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

Теперь я пытаюсь подражать примеру закрытия JavaScript на Wikipedia, с переводом "straigth" на Java, в надеюсь быть полезным:

//ECMAScript
var f, g;
function foo() {
  var x = 0;
  f = function() { return ++x; };
  g = function() { return --x; };
  x = 1;
  print('inside foo, call to f(): ' + f()); // "2"  
}
foo();
print('call to g(): ' + g()); // "1"
print('call to f(): ' + f()); // "2"

Теперь часть java: Function1 - это интерфейс "Functor" с arity 1 (один аргумент). Closure - это класс, реализующий Function1, конкретный Functor, который действует как функция (int → int). В методе main() я просто создаю foo как объект Closure, реплицируя вызовы из примера JavaScript. Класс IntBox - просто простой контейнер, он ведет себя как массив из 1 int:

int a[1] = {0}
interface Function1   {
    public final IntBag value = new IntBag();
    public int apply();
}

class Closure implements Function1 {
   private IntBag x = value;
   Function1 f;
   Function1 g;

   @Override
   public int apply()  {
    // print('inside foo, call to f(): ' + f()); // "2"
    // inside apply, call to f.apply()
    System.out.println("inside foo, call to f.apply(): " + f.apply());
    return 0;
}

public Closure() {
    f = new Function1() {
        @Override
        public int apply()  {
            x.add(1);
            return x.get();
        }
    };
    g = new Function1() {
        @Override
        public int apply()  {
            x.add(-1);
            return x.get();
        }
    };
    // x = 1;
    x.set(1);
   }
}
 public class ClosureTest {
 public static void main(String[] args) {
   // foo()
    Closure foo = new Closure();
    foo.apply();
    // print('call to g(): ' + g()); // "1"
    System.out.println("call to foo.g.apply(): " + foo.g.apply());
    // print('call to f(): ' + f()); // "2"
    System.out.println("call to foo.f.apply(): " + foo.f.apply());

   }
  }

Он печатает:

inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2 

Ответ 5

Java Closures будет частью J2SE 8 и будет выпущен к концу 2012 года.

Поддержка закрытий на Java 8 включает концепцию лямбда-выражений, ссылку на метод, конструкторскую ссылку и методы по умолчанию.

Для получения дополнительной информации и рабочих примеров для этого, пожалуйста, посетите: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html