자바 7의 폐쇄 [종료]


105

폐쇄 란 무엇입니까? Java 7에 포함되어야합니다. (클로저는 Java 7에 포함되도록 논의되었지만 결국에는 포함되지 않았습니다. -ed) 클로저에 대해 배울 수있는 신뢰할 수있는 참고 자료를 제공 할 수 있습니까?

답변:


59

다음은 Java에서 클로저를 도입 한 개척자 중 하나 인 Neal Gafter의 블로그 입니다. 2007 년 1 월 28 일 폐쇄에 대한 그의 게시물은 A Definition of Closures로 명명되었습니다 . 그의 블로그에는 비디오뿐만 아니라 시작하는 데 도움이되는 많은 정보가 있습니다. 여기에 훌륭한 Google 토크가 있습니다 . 프로그래밍 언어의 고급 주제 -Neal Gafter와 함께 Java 를위한 클로저 도 있습니다.


2
전체 블로그보다 더 구체적인 링크가 있습니까?
I82Much


1
누군가 나처럼 멍청하고 벽에 대고 머리를 치고 있다면이 클로저가 뭔지 알기 위해 .... 그런 다음 .. youtube.com/watch?v=Nj3_DMUXEbE
Piyush Kukadiya

내가 didnt 한 처음에 them..kinda 미친 가지고 언어로 클로저를 구현 상상하지 못할
알렉산더 밀스

알렉산더 밀스는 궁금해 .. 왜?
Bartzilla

84

클로저는 둘러싸는 범위의 변수에 액세스하여 참조 (및 전달) 할 수있는 코드 블록입니다.

Java 1.1 이후로 익명의 내부 클래스는이 기능을 매우 장황한 방식으로 제공했습니다. 또한 final지역 변수 만 사용할 수 있다는 (그리고 확실히 할당 된) 제한이 있습니다. (비 final지역 변수도 범위 내에 있지만 사용할 수 없습니다.)

Java SE 8은 "lambdas"라고하는 단일 메소드 인터페이스 *에 대해보다 간결한 버전을 갖도록 고안되었습니다. Lambda에는 익명 내부 클래스와 거의 동일한 제한이 있지만 일부 세부 정보는 무작위로 다릅니다.

LambdaProject LambdaJSR 335 하에서 개발되고 있습니다.

* 원래 설계는 SAM (Single Abstract Methods) 유형을 허용하는 더 유연했습니다. 불행히도 새로운 디자인은 덜 유연하지만 인터페이스 내에서 구현을 허용하는 것을 정당화하려고합니다.


7

Tom Hawtin 에 따르면

클로저는 둘러싸는 범위의 변수에 액세스하여 참조 (및 전달) 할 수있는 코드 블록입니다.

이제 나는 유용하기를 바라면서 자바 로의 " straigth "번역 과 함께 Wikipedia 의 JavaScript 클로저 예제를 에뮬레이트하려고 합니다.

//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은 arity 1 (하나의 인수)이있는 "Functor"인터페이스입니다. Closure는 함수 역할을하는 구체적인 Functor 인 Function1을 구현하는 클래스입니다 (int-> int). main () 메서드에서 JavaScript 예제의 호출을 복제하여 foo를 Closure 객체로 인스턴스화합니다. IntBox 클래스는 단순한 컨테이너이며 1 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
이름 외에 IMO는 폐쇄와 관련이 없습니다
n00b


4

Java Closures는 J2SE 8의 일부가 될 예정이며 2012 년 말에 출시 될 예정입니다.

Java 8의 클로저 지원에는 Lambda 표현식, 메서드 참조, 생성자 참조 및 기본 메서드의 개념이 포함됩니다.

이에 대한 자세한 정보와 작업 예제는 http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html을 방문하십시오.


1
흠, 그러나 Java 8은 클로저 변수의 수정을 허용하지 않습니다. 좋은 기사.
nawfal


0

Java 5, 6 및 7에 대한 클로저 구현

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

그것은 하나가 요청할 수있는 모든 것을 포함합니다 ...


링크는이를 설명하는 텍스트로 이동하지만 해당 페이지에서 링크 된 코드가 존재하지 않습니다. 구현은 어디에 있습니까?
Jerry Jeremiah

@JerryJeremiah 여기에 이름이 다르지만 원래 존재하는 모든 버전이 존재하지 않습니다 (비 최종 액세스 및 추상 클래스를 통해 더 많은 것을 지원하기 위해 <Java 8 버전에 대해 다시 추가 될 수 있습니다. 어떤 플랫폼입니까? 찾고 계십니까?) : bitbucket.org/momomo/opensource/src
mmm

2
링크가 깨졌습니다!
sunleo

내가 링크가 죽었다는 404을 가지고
알렉산더 밀스

링크가 끊어졌습니다 (이것이 우리가 답변으로 링크를 넣어서는 안되는 이유입니다 ...)
OhadR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.