Закрытие в Java 7 [закрыто]

105

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

Сваранга Сарма
источник

Ответы:

59

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

Барцилла
источник
2
У вас есть более конкретная ссылка, чем весь блог?
I82Much
2
Попробуйте это gafter.blogspot.co.uk/2007/01/definition-of-closures.html
Лидия Ральф,
1
Если кто-то такой тупой, как я, и если вы бьетесь головой об стену, просто чтобы знать, что за взлом это Closure .... тогда вперед .. youtube.com/watch?v=Nj3_DMUXEbE
Пиюш Кукадия
Я не могу себе представить реализацию замыканий на языке, в котором их изначально не было ... какое-то безумие
Александр Миллс
Александру Миллсу просто любопытно .. почему?
Bartzilla 01
84

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

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

Предполагается, что Java SE 8 будет иметь более сжатую версию этого для интерфейсов с одним методом *, называемую «лямбда-выражения». Лямбды имеют те же ограничения, что и анонимные внутренние классы, хотя некоторые детали меняются случайным образом.

Лямбда-выражения разрабатываются в рамках Project Lambda и JSR 335 .

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

Том Хотин - tackline
источник
7

По словам Тома Хотина

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

Теперь я пытаюсь имитировать пример закрытия JavaScript в Википедии с « прямым » переводом на 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» с арностью 1 (один аргумент). Замыкание - это класс, реализующий 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 
Роб Розетти
источник
2
ИМО, помимо названия, это не имеет ничего общего с закрытием
n00b
4

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

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

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

Амит Пхалтанкар
источник
1
Хм, но Java 8 не позволяет изменять закрывающую переменную. Хорошая статья.
nawfal 05
0

Реализация закрытия для Java 5, 6 и 7

http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html

В нем есть все, что можно пожелать ...

ммм
источник
Ссылка ведет к некоторому тексту с ее описанием, но кода, на который есть ссылка на этой странице, не существует. Где реализация?
Джерри Иеремия,
@JerryJeremiah Вот он, теперь у него другое имя, также все версии, которые изначально присутствуют, отсутствуют (для поддержки неокончательного доступа и многого другого через абстрактные классы, его можно добавить снова для версий <Java 8, на какой платформе вы ищите?): bitbucket.org/momomo/opensource/src
ммм
2
Ссылки рвутся!
sunleo 04
я получил 404, ссылка мертва
Александр Миллс
ссылка не работает (вот почему мы не должны помещать ссылки в качестве ответов ...)
OhadR